搜索列表中的值并输出其键

时间:2013-07-22 21:45:33

标签: python

我有一个字典,其中每个键都有一个列表作为其值,这些列表具有不同的大小。我使用add和set填充了键和值(以避免重复)。如果我输出我的字典,输出是:

blizzard set(['00:13:e8:17:9f:25', '00:21:6a:33:81:50', '58:bc:27:13:37:c9', '00:19:d2:33:ad:9d'])
alpha_jian set(['00:13:e8:17:9f:25'])  

在这里,暴雪和alpha_jian是我字典中的两个键。

现在,我有另一个文本文件,其中有两列,如

00:21:6a:33:81:50    45  
00:13:e8:17:9f:25    59  

如您所见,第一列项是我字典的每个列表中的一个条目。例如,00:21:6a:33:81:50属于关键'暴风雪'而00:13:e8:17:9f:25属于关键'alpha_jian'。

我想要的问题是,浏览我的文本文件中的第一列项,如果在词典中找到该列条目,找到其对应的键,找到字典中相应列表的长度,并将它们添加到新的字典,说newDict 例如00:21:6a:33:81:50属于暴风雪。因此,newDict条目将是:

newDict[blizzard] = 4  // since the blizzard key corresponds to a list of length 4.  

这是我期望执行此任务的代码:

newDict = dict()
# myDict is present with entries like specified above
with open("input.txt") as f:
    for line in f:  
        fields = line.split("\t")  
        for key, value in myDict.items():
            if fields[0] == #Some Expression:
                newdict[key] = len(value)  
print newDict  

在这里,我的问题是我的代码中应该是#Some Expression。如果值不是列表,这很容易。但是如何在列表中搜索?提前谢谢。

4 个答案:

答案 0 :(得分:1)

您正在寻找in

if fields[0] in value:

但这不是一种非常有效的方法,因为它涉及到反复扫描dict值

您可以制作临时数据结构以提供帮助

helper_dict = {k: v for v, x in myDict.items() for k in x}

所以你的代码变成了

helper_dict = {k: v for v, x in myDict.items() for k in x}
with open("input.txt") as f:
    for line in f:  
        fields = line.split("\t")
        key = fields[0]
        if key in helper_dict:
            newdict[helper_dict[key]] = len(myDict[helper_dict[key]])

答案 1 :(得分:0)

没有

if fields[0] in value:

解决你的问题?或者我不明白你的问题?

答案 2 :(得分:0)

if fields[0] in value:应该这样做,因为根据你的说法,字典中的每个值都是一个集合,无论长度是1还是更长。

使用像'00:13:e8:17:9f:25'这样的键构建一个新字典可能会更有效(假设它们是唯一的),相关的值是你开始之前它们集合中的条目数 - 这样你就可以避免反复重新计算这些东西。显然,如果列表不长,那么它就没有太大的区别。

答案 3 :(得分:0)

看起来像

if fields[0] in value:

应该做的伎俩。即检查该字段是否是该集合的成员(这也适用于列表,但至少如果列表很大则有点慢)。

(请注意,列表和集合是两个不同的东西;一个是有序容器,可以包含相同值的多个副本,另一个是无序容器,每个值只能包含一个副本。)

您可能还想在break分配后添加newdict,因此您不会继续检查所有其他字典条目。