我有一个字典,其中包含值列表和列表:
dict1={'first':['hi','nice'], 'second':['night','moon']}
list1= [ 'nice','moon','hi']
如果每个键的值都出现在列表中,我想将字典中的值与list1进行比较,并为这些键做一个计数器: 输出应如下所示:
first 2
second 1
这是我的代码:
count = 0
for list_item in list1:
for dict_v in dict1.values():
if list_item.split() == dict_v:
count+= 1
print(dict.keys,count)
有什么帮助吗?预先感谢
答案 0 :(得分:7)
我将在set
中使用list1
进行O(1)查找,并访问intersection
方法。然后运用字典理解。
>>> dict1={'first':['hi','nice'], 'second':['night','moon']}
>>> list1= [ 'nice','moon','hi']
>>>
>>> set1 = set(list1)
>>> {k:len(set1.intersection(v)) for k, v in dict1.items()}
{'first': 2, 'second': 1}
intersection
接受任何可迭代的参数,因此没有必要根据dict1
的值创建集合。
答案 1 :(得分:2)
您可以使用以下dict理解:
{k: sum(1 for i in l if i in list1) for k, l in dict1.items()}
给出示例输入,将返回:
{'first': 2, 'second': 1}
答案 2 :(得分:2)
您可以使用集合获取列表和dict1
的值的交集:
for key in dict1.keys():
count = len(set(dict1[key]) & set(list1))
print("{0}: {1}".format(key,count))
答案 3 :(得分:1)
虽然简洁性很好,但我想也提供一个尽可能接近OP原始代码的示例会很好:
# notice conversion to set for O(1) lookup
# instead of O(n) lookup where n is the size of the list of desired items
dict1={'first':['hi','nice'], 'second':['night','moon']}
set1= set([ 'nice','moon','hi'])
for key, values in dict1.items():
counter = 0
for val in values:
if val in set1:
counter += 1
print key, counter
答案 4 :(得分:0)
最简单,最基本的方法是:
dict1={'first':['hi','nice'], 'second':['night','moon']}
list1= [ 'nice','moon','hi']
listkeys=list(dict1.keys())
listvalues=list(dict1.values())
for i in range(0,len(listvalues)):
ctr=0
for j in range(0,len(listvalues[i])):
for k in range(0,len(list1)):
if list1[k]==listvalues[i][j]:
ctr+=1
print(listkeys[i],ctr)
希望有帮助。
答案 5 :(得分:0)
使用collections.Counter
from collections import Counter
c = Counter(k for k in dict1 for i in list1 if i in dict1[k])
# Counter({'first': 2, 'second': 1})