比较Python字典中的值

3

我有两个Python中的嵌套字典,格式如下:

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、1166870和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个回答

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中,您需要用.values()替换.itervalues()
因为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'])

但那样做真的非常低效,更不用说是不正确的。

我无法运行代码 chr = { v['chr'] for v in file_dict.itervalues() },它显示无效语法。 - Leo.peis
@Leo.peis:这个语法是在Python 2.7中引入的,我会进行更新。 - Martijn Pieters
在Python3中,您可以将itervalues替换为values - Alex
@Leo.peis:我在Python 2.7中测试了这段代码。你是不是正确地复制了这个代码?检查一下这行代码前面的内容,看看你是否忘记了关闭括号或其他东西。 - Martijn Pieters
我应该删除自己的回复吗?因为它与你的回复重复了。 - jcr
显示剩余2条评论

1

可以考虑类似这样的内容:

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

这是如何工作的?

首先,列表推导式获取内部字典中所有chr条目,然后将它们转换为集合,以便没有重复条目,如果您喜欢,可以将它们转换为列表格式。

请注意,也许您真的想使用一个集合,那么查找时间就是O(1)而不是O(n)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接