0

我有一本字典,其中每个键都有一个列表作为其值,并且这些列表的大小不同。我使用 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'])  

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

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

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

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

我想要的问题是,浏览我的文本文件中的第一列项目,如果在字典中找到该列条目,找到其对应的键,在字典中找到对应列表的长度,然后将它们添加到新字典中,比如说新词典。
例如 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

4 回答 4

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]])
于 2013-07-22T21:49:37.340 回答
0

if fields[0] in value:

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

于 2013-07-22T21:49:15.280 回答
0

if fields[0] in value:鉴于您在上面所说的字典中的每个值都是一个集合,无论长度为 1 还是更大,都应该做到这一点。

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

于 2013-07-22T21:49:29.400 回答
0

好像

if fields[0] in value:

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

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

您可能还想break在分配后添加一个newdict,这样您就不必一直检查所有其他字典条目。

于 2013-07-22T21:51:54.543 回答