给出一个列表列表,如何创建一个字典,其中键是列表中的所有项目(一个副本),并且值是它们是列表中第一项的次数?
给出:
[['banana','oranges','grapes'],['banana',['grapes','banana']]
预期:
{'banana': 2,'grapes': 1,'oranges': 0}
给出一个列表列表,如何创建一个字典,其中键是列表中的所有项目(一个副本),并且值是它们是列表中第一项的次数?
给出:
[['banana','oranges','grapes'],['banana',['grapes','banana']]
预期:
{'banana': 2,'grapes': 1,'oranges': 0}
首先获取第一个元素的列表:
filtered_list = [x[0] for x in initial_list]
这是您的独特元素:
unique_elements = set([y for x in initial_list for y in x])
现在使用唯一元素的键和零值初始化字典:
counts = {e: 0 for e in unique_elements}
最后用过滤列表中每个元素的频率更新字典的值。由于您询问的解决方案不包含counter
,因此这里有一个简单的循环可以实现:
for i in filtered_list:
counts[i] = counts.get(i,0) + 1
print(counts)
# {'banana': 2,'grapes': 1,'oranges': 0}
,
您可以使用集合来获得子列表中存在的唯一名称:
initial_list = [['banana','oranges','grapes'],['banana',['grapes','banana']]
unique = set()
for l in initial_list:
unique = unique.union(set(l))
然后计算每个项目的存在数量(假设每个项目存在或不存在,不重复):
from collections import defaultdict
result = defaultdict(lambda: 0)
for element in unique:
for l in initial_list:
result[element] += (element == l[0])
Defaultict用于获取初始值0
而且您应该将结果放在result
bool
是int
的子类这一事实用于将element == l[0]
评估为1
或0
如果没有collections
,则需要将最后一行编辑为:
try:
result[element] += (element == l[0])
except KeyError:
result[element] = 1
,
创建列表列表:
ll = [['banana','banana']]
获取唯一密钥:
from itertools import chain
d = dict.fromkeys(chain(*ll),0)
计算列表的第一个元素:
from collections import Counter
from operator import itemgetter
c = Counter(map(itemgetter(0),ll))
更新并显示结果:
d.update(dict(c))
print(d)
打印:
{'banana': 2,'oranges': 0,'grapes': 1}
,
之前的所有回复对我来说都失败了。这是一个非常快速的实现:
# l is a list of lists
import itertools
ext_l = list(itertools.chain.from_iterable(l))
l_dic = {element:0 for element in set(ext_l)}
for i in ext_l: l_dic[i] += 1
print(l)
,
简单的实现
l = [['banana','banana']]
unique_items = set([i for sl in l for i in sl])
d = dict()
for item in unique_items:
d[item] = 0
for sublist in l:
d[sublist[0]] += 1
print(d)
# output
# {'grapes': 1,'banana': 2}
保持秩序
d = dict()
for sl in l:
d[sl[0]] = d.get(sl[0],0) + 1
print(d)
# {'banana': 2,'grapes': 1}
unique_items = set([i for sl in l for i in sl])
for item in unique_items:
if item not in d:
d[item] = 0
print(d)
# {'banana': 2,'oranges': 0}