我有一个包含键值对的字典,因为它们是。值是列表或列表列表。
对于看起来像这样的字典:
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_ figure将值中的数字与此代码的其他部分的变量进行比较。任何隔离这些的方法对我来说都足够了。
预期输出
45
300
65
11500
答案 0 :(得分:3)
一种做法是"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循环是在那里循环遍历子列表吗?你没有子列表,所以要突破它
答案 1 :(得分:1)
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
输出:45 300 65 11500 12500
答案 2 :(得分:1)
或更清洁,更短:
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)
答案 3 :(得分:1)
代码中只需要一行。您应该检查元素类型。像这样:
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
答案 4 :(得分:0)
另一种方法是首先转换为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))))