python - 按照列表中值的顺序过滤已排序的 NumPy 数组的行
问题描述
我正在尝试遍历 NumPy 数组以创建列表列表,但使用的 for 循环按字母顺序而不是按出现顺序附加到列表列表中。
这是我可以用作示例的 NumPy 数组的一部分:
tarifas = np.array([['Afganistán', '577.21', '0.9360168799091559', '1.01745744495737'],
['Albania', '5450.0', '1.1439867079655244', '0.9195410037811979'],
['Alemania', '49690', '1.0034542200895549', '0.9873874704432137'],
['Angola', '3670.0', '0.931103978746121', '1.162652536895962'],
['Antigua y Barbuda', '18170', '0.7795684991736309', '0.6399312443495023'],
['Arabia Saudita', '23490', '1.0573676413333202', '0.7477763277701148'],
['Argelia', '4650.0', '0.7969840140783656', '0.5123046862189027'],
['Argentina', '9050.0', '1.3647162509775996', '0.48274125735042017'],
['Armenia', '4450.0', '1.4545784506262867', '1.430465487479917'],
['Australia', '57200', '0.7293018985322222', '1.1744384938116095'],
['Austria', '52470', '1.2396562976033307', '0.8630735107719588'],
['Azerbaiyán', '4780.0', '0.9111186496911305','0.534268284966654']])
我想创建一个列表列表,使用另一个列表进行迭代,该列表将具有我需要在数组中找到的国家/地区的特定名称,即
list_countries = ["Angola", "Austria", "Argentina", "Albania", "Armenia"]
请注意列表不是按字母顺序排列的,因此列表列表应遵循此顺序。迭代后的输出应该如下:
new_list_of_countries = [['Angola' '3670.0' '0.931103978746121' '1.162652536895962'],
['Austria' '52470' '1.2396562976033307' '0.8630735107719588'],
['Argentina' '9050.0' '1.3647162509775996' '0.48274125735042017'],
['Albania' '5450.0' '1.1439867079655244' '0.9195410037811979'],
['Armenia' '4450.0' '1.4545784506262867' '1.430465487479917']]
这是我使用的代码:
tarifas_paises_escogidos = []
for i in tarifas:
for v in list_countries:
if str(v) in str(i):
tarifas_paises_escogidos.append(i)
print(np.array(tarifas_paises_escogidos))
解决方案
使用列表推导sorted
:
sorted([t for t in tarifas if t[0] in list_countries],
key=lambda x: list_countries.index(x[0]))
输出:
[['Angola', '3670.0', '0.931103978746121', '1.162652536895962'],
['Austria', '52470', '1.2396562976033307', '0.8630735107719588'],
['Argentina', '9050.0', '1.3647162509775996', '0.48274125735042017'],
['Albania', '5450.0', '1.1439867079655244', '0.9195410037811979'],
['Armenia', '4450.0', '1.4545784506262867', '1.430465487479917']]
一个不使用列表理解的:
tarifas_paises_escogidos = []
for t in tarifas:
# for v in list_countries: You don't need this
if t[0] in list_countries:
tarifas_paises_escogidos.append(t)
print(tarifas_paises_escogidos)
产生过滤但未排序:
[['Albania', '5450.0', '1.1439867079655244', '0.9195410037811979'],
['Angola', '3670.0', '0.931103978746121', '1.162652536895962'],
['Argentina', '9050.0', '1.3647162509775996', '0.48274125735042017'],
['Armenia', '4450.0', '1.4545784506262867', '1.430465487479917'],
['Austria', '52470', '1.2396562976033307', '0.8630735107719588']]
然后你排序(并分配回来!):
tarifas_paises_escogidos = sorted(tarifas_paises_escogidos, key=lambda x: list_countries.index(x[0]))
这使得上述输出。
洞察力:
在lambda
上面,x
几乎没有任何意义。它只是意味着无论输入什么lambda
,它都被定义为x
,并用于索引(即x[0]
)。
它与以下内容相同:
def some_func(x):
return list_countries.index(x[0])
然后用于sorted
:
tarifas_paises_escogidos = sorted(tarifas_paises_escogidos, key=some_func)
但是您可能经常会发现只为一个用例定义一个函数非常低效。那是lambda
开始的时候:)。
推荐阅读
- laravel - 仅在满足条件时才允许 laravel 关系
- java - 不同的 MVP 应该如何共享数据
- git - 使用 VS 代码进行 Git 推送
- r - 查找有条件的连续天
- sql - 仅在 SQL Server 中将 bigint 转换为日期?
- python - 如何在 python venv 中获取 pylint 状态码
- php - 如何使用 xdebug 生成详细的代码覆盖率报告?
- javascript - 使用 JS 检查 YouTube 缩略图是否已加载
- javascript - 获取 Vue.js 组件在头脚本中设置的 cookie 变量
- python - Python Tesseract 努力解释计算机文本日期