我有一个数组字典。
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。
我该怎么做?
答案 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']