![](/img/trans.png)
[英]How do I efficiently extract all elements in a column from a dictionary whose values are 2D lists in Python?
[英]How do I select from a dictionary whose values are a list of lists in python2.7?
我有一本包含键值对的字典。 值是所有列表或列表列表。
对于这样的字典:
d={}
d['FM_001323'] = [[45,11232],[300,400],[65,700]]
d['FM_094326'] = [11500,12500]
如果要通过每个键查看值中每个列表的第一个条目,则不能像每个条目都是列表的列表那样进行以下操作:
for j in d:
for i in range(0,len(d[j]):
print d[j][i][0]
因为字典中的第二个键只有一个值列表,而不是列表列表,并且[0]索引没有任何引用。 那有意义吗?
我想隔离每个键的每个列表值中的第一个条目。 使用列表值或列表值列表很容易,但是将它们混合在一起会使它变得复杂。
我也乐于寻求更简单的方法来实现相同的目标。 对于上下文:我试图通过FM_数字将值中的数字与该代码其他部分的变量进行比较。 隔离这些的任何方法对我来说就足够了。
预期输出为
45
300
65
11500
一种方法是"Asked Forgiveness Not Permission"
d={}
d['FM_001323'] = [[45,11232],[300,400],[65,700]]
d['FM_094326'] = [11500,12500]
for j in d:
for i in range(0,len(d[j])):
try:
print(d[j][i][0])
except TypeError:
print(d[j][0])
break
印刷品:
45
300
65
11500
基本上,只需在try块中执行此操作,然后捕获如果无法解决的异常将引发的异常,然后再尝试其他操作。
编辑为OP所需的输出。 只需在第一次打印后跳出循环,因为您的第二个for循环就可以循环浏览子列表了吗? 您没有子列表,所以就打破它吧
d={}
d['FM_001323'] = [[45,11232],[300,400],[65,700]]
d['FM_094326'] = [11500,12500]
for k in d:
for v in d[k]:
if isinstance(v, list):
print v[0]
else:
print v
输出:45300 65 11500 12500
或更清洁或更短:
d={}
d['FM_001323'] = [[45,11232],[300,400],[65,700]]
d['FM_094326'] = [11500,12500]
for j in d.itervalues():
for i in j:
if isinstance(i,list):
print(i[0])
else:
print(i)
您的代码中仅需添加一行。 您应该检查元素类型。 像这样:
for j in d:
for i in range(0,len(d[j])):
#See the line below.
if type(d[j][i]) == type([]):
print(d[j][i][0])
else
print(d[j][i])
注意:如果d [j]仅具有数字且没有列表,则只想打印第一个元素。 您可能必须运行一个附加循环才能找出d [j]中是否有任何列表。 参见下面的代码:
for j in d:
#Check if all elements in d[j] are int.
for i in d[j]:
if type(i) ==type([]):
break
else:
print(d[j][0])
continue
for i in range(0,len(d[j])):
#See the line below.
if type(d[j][i]) == type([]):
print(d[j][i][0])
else:
print(d[j][i])
因此,对于d [j] = [11500,[1,2],1300] ,将打印11500 1和1300 。
另一种方法是先转换为str
然后在r'\\[{0-9}+'
,这将给出所有前导元素:
from __future__ import print_function
import re
d={}
d['FM_001323'] = [[45,11232],[300,400],[65,700]]
d['FM_094326'] = [11500,12500]
for v in d.values():
print('\n'.join(s[1:] for s in re.findall(r'\[[0-9]+', str(v))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.