我有一个字典,其中每个键都有一个列表作为其值,这些列表具有不同的大小。我使用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。如果值不是列表,这很容易。但是如何在列表中搜索?提前谢谢。
答案 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
,因此您不会继续检查所有其他字典条目。