如何使用字典数组中的条件从同一字典中的另一个数组中提取元素?

时间:2019-04-17 13:54:16

标签: python list dictionary

我有一个数组字典。

mydict={'a':[45,65,78,32], 'b':['red','blue','green','yellow'], 'c':[3.4, 4.5, 6.5, 7.6]}

我想在mydict['b']大于mydict['a']时提取35的元素。我要

myarr = ['red','blue','green']

我尝试-

myarr = [mydict['b'] for num in mydict['a'] num > 35]

我不想走枚举和保存索引以及使用索引的C ++ / C路线。听起来不像Python。

我该怎么做?

5 个答案:

答案 0 :(得分:3)

您已经接近,需要使用zip

[b for a, b in zip(mydict['a'], mydict['b']) if a > 35]

答案 1 :(得分:3)

如果list的值创建新的dict['a'] > 35

mydict = {'a':[45,65,78,32], 'b':['red','blue','green','yellow'], 'c':[3.4, 4.5, 6.5, 7.6]}

Python 3.x

使用itertools.zip_longest(*iterables, fillvalue=None)

来自docs

  

制作一个迭代器,该迭代器汇总每个可迭代对象中的元素。   如果可迭代项的长度不均匀,则填写缺失值   具有fillvalue。迭代一直持续到最长的迭代是   精疲力竭

print([y for x,y in zip_longest(mydict['a'],mydict['b']) if x > 35])

Python 2.x

使用itertools.izip_longest(*iterables[, fillvalue])

print([y for x,y in izip_longest(mydict['a'],mydict['b']) if x > 35])

输出

['red', 'blue', 'green']

编辑

zip()zip_longest()有什么区别?

请考虑以下列表:

x = [1,2,3,4,5]    
y = ['a','b','c']

for a,b in zip(x,y):
    print(a,b)

输出

1 a
2 b
3 c

由于在4,5中找不到对应的元素,因此显然跳过了x中的元素y

使用zip_longest()

x = [1,2,3,4,5]    
y = ['a','b','c']

for a,b in zip_longest(x,y):
    print(a,b)

输出

1 a
2 b
3 c
4 None
5 None

它没有跳过x中的元素,而是用None填充了y中缺少的元素。

答案 2 :(得分:1)

您可以使用enumerate访问相应的索引i,使用该索引可以从mydict['b']获取相应的值。

myarr = [mydict['b'][i]  for i, num in enumerate(mydict['a']) if num > 35]
# ['red', 'blue', 'green']

答案 3 :(得分:1)

尝试一下:

[j for i,j in zip(mydict['a'],mydict['b']) if i>35] 

答案 4 :(得分:1)

如果您愿意使用pandas,则这种过滤非常简单。

首先将mydict传递到DataFrame构造函数:

import pandas as pd
df = pd.DataFrame(mydict)
print(df)
#    a       b    c
#0  45     red  3.4
#1  65    blue  4.5
#2  78   green  6.5
#3  32  yellow  7.6

现在使用符合您条件的boolean mask to filter the columns

print(df[df['a']>35])
#    a      b    c
#0  45    red  3.4
#1  65   blue  4.5
#2  78  green  6.5

要获得所需的输出列表,可以执行以下操作:

myarr = df[df['a']>35]['b'].values.tolist()
print(myarr)
#['red', 'blue', 'green']