繁体   English   中英

如何从值是python2.7中列表列表的字典中选择?

[英]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 11300

另一种方法是先转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM