比较字典python中的值

时间:2012-12-07 11:14:41

标签: python dictionary

我在Python中有2个具有以下格式的嵌套词典:

1166869: {'probL2': '0.000', 'probL1': '0.000', 'pronNDiff_site': '1.000', 'StateBin': '0', 'chr': 'chrX', 'rangehist': '59254000-59255000', 'start_bin': '59254000', 'countL2': '4', 'countL1': '0'} 

1166870: {'probL2': '0.148', 'probL1': '0.000', 'pronNDiff_site': '0.851', 'StateBin': '0', 'chr': 'chr2', 'rangehist': '59254000-59255000', 'start_bin': '59255000', 'countL2': '5', 'countL1': '15'} 

1166871: {'probL2': '0.000', 'probL1': '0.000', 'pronNDiff_site': '1.000', 'StateBin': '0', 'chr': 'chrY', 'rangehist': '59290000-59291000', 'start_bin': '59290000', 'countL2': '1', 'countL1': '2'}

其中1166869,11668和1166871表示我从中读取数据的文件中的一行,其余的键是数据本身。

现在我想制作一个列表,我将所有不同的值存储在键“chr”中,因为有一些重复的值。

如何浏览字典并对2个值进行比较?此代码无效:

for k in range(len(file_dict)):
    for j in range(len(file_dict)-1):
        if (file_dict[j]["chr"] != file_dict[k]["chr"]):
            list_chr.append(file_dict[j]["chr"])

2 个答案:

答案 0 :(得分:7)

使用一套,只需一次性使用所有项目:

chr = { v['chr'] for v in file_dict.itervalues() }

这使用集合理解来在一行代码中生成集合。

在Python 2.7中引入了集合理解;在早期版本中使用:

chr = set(v['chr'] for v in file_dict.itervalues())

在Python 3中,您需要将.itervalues()替换为.values()

你自己的代码不起作用,因为python词典不是列表;您不是按索引检索值,而是按键检索值。您必须将其更改为:

for key in file_dict:
    for other_key in file_dict:
        if key == other_key:
            continue

        if file_dict[key]['chr'] != file_dict[otherkey]['chr']:
            list_chr.append(filed_dict[key]['chr'])

真的效率低下,更不用说错误了。

答案 1 :(得分:1)

如何处理以下内容:

list_chr = list(set([val['chr'] for val in file_dict.values()]))

这是如何工作的?

首先,列表理解获取内部字典中的所有chr条目 然后将它们转换为集合,这样就没有重复的条目 然后将这些转换为列表,如果这是您喜欢的格式

请注意,也许你真的想要使用一套,然后查找时间是O(1)而不是O(n)

相关问题