我有字典和清单。列表仅包含项目,字典包含项目以及我拥有多少个给定项目。我想做的是遍历字典和列表,如果字典中的键与列表中的项目相同,我只想将其值更新1,但是如果没有相同的项目将项目表单列表添加到dict并将其值设置为1。
stock = {apple: 1, banana: 4, orange: 10}
delivery = [apple, apple, grapefruit]
for k, v in stock.items():
for item in delivery:
if item == stock[k]:
stock[v] += 1
else:
stock.update({item:1})
输出应如下所示:
stock = {apple: 3, banana: 4, orange: 10, grapefruit: 1}
但是我收到消息:字典在迭代过程中更改了大小
答案 0 :(得分:4)
迭代时,请勿更改dict
或list
。您可以像这样编写代码:
stock = {'apple': 1, 'banana': 4, 'orange': 10}
delivery = ['apple', 'apple', 'grapefruit']
for item in delivery:
if item in stock:
stock[item] +=1
else:
stock[item] = 1
print(stock)
答案 1 :(得分:2)
您实际上可以使用Counter
中的collections
,它确实可以满足您的需求。
from collections import Counter
stock = Counter({'apple': 1, 'banana': 4, 'orange': 10})
delivery = ['apple', 'apple', 'grapefruit']
stock.update(delivery)
答案 2 :(得分:1)
使用dict.get()
:
stock = {'apple': 1, 'banana': 4, 'orange': 10}
delivery = ['apple', 'apple', 'grapefruit']
for d in delivery:
stock[d] = stock.get(d, 0) + 1
print(stock)
输出:
{'apple': 3, 'banana': 4, 'orange': 10, 'grapefruit': 1}
答案 3 :(得分:0)
您可能希望颠倒枚举顺序并遍历列表,将项目添加到字典或将它们的值增加一,视情况而定:
for item in delivery:
if item in stock:
stock[item] += 1
else:
stock[item] = 1
(请注意,您也可以将defaultdict(int)用于“ stock”字典对象,因此,您甚至不需要if / else即可,只需执行以下操作:
for item in delivery:
stock[item] += 1
答案 4 :(得分:0)
在这种情况下,最好的办法是使用 Counter 集合而不是标准字典(https://docs.python.org/2/library/collections.html) 看看那里给出的基本示例:
# Tally occurrences of words in a list
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[word] += 1
使用标准字典时,您可以遍历列表并遵循以下几行:
for v in delivery:
try:
stock[v] += 1
except KeyError:
stock[v] = 1
或者,您可以使用dict的* get *方法并测试无。
答案 5 :(得分:0)
您可以为此目的使用collections.counter
from collections import Counter
stock = Counter({'apple': 1, 'banana': 4, 'orange': 10})
delivery = ['apple', 'apple', 'grapefruit']
stock.update(delivery)
stock
# Counter({'orange': 10, 'banana': 4, 'apple': 3, 'grapefruit': 1})
答案 6 :(得分:0)
也可以这样:
stock = {'apple': 1, 'banana': 4, 'orange': 10}
delivery = ['apple', 'apple', 'grapefruit']
stock.update({item: delivery.count(item) + stock.get(item,0)
for item in set(delivery)})
print(stock)
# {'apple': 3, 'banana': 4, 'orange': 10, 'grapefruit': 1})