我正在尝试更新列表字典中的值 EX:我有一个字典输入:
d={0: [0,1], 1:[1],2:[2],3:[3]}
并配对[0,2]
并且我想用0,2替换dict中的每个0并且将每个值> 2增加1,所以这里是预期的输出:
{0: [0,2,1], 1:[1],2:[2],3:[4]}
我试图迭代所有值,但它没有正确地解决这个问题
def update_dict(_dict,_pair):
for i in range(len(_dict.keys())):
for j in range(len(_dict.values()[i])):
if dict[i][j]==_pair[0]:
dict[i][j].remove(_pair[0])
dict[i].append(_pair)
return _dict
我如何实现这一目标? 在此先感谢您的任何帮助
答案 0 :(得分:2)
你不需要这里的字典,你想要一个清单;你有一系列从0开始的有序键,列表的索引可以更有效地满足这种需要:
l = [[0,1], [1], [2], [3]]
您可以生成所需的输出:
for i, nested in enumerate(l):
# replace all 0 values with 1, 2
while 0 in nested:
zero_index = nested.index(0)
nested[zero_index:zero_index + 1] = [1, 2]
# increment values in the nested list if the index is over 2:
if i > 2:
nested[:] = [v + 1 for v in nested]
这会就地修改原始嵌套列表。
答案 1 :(得分:1)
如果您仍想使用字典,则可以:
d = {0: [0,1], 1:[1],2:[2],3:[3]}
for k, li in d.items():
for i, v in enumerate(li[:]):
if v == 0:
li.insert(i + 1, 2)
elif v > 2:
d[k][i] += 1
print(d)
# {0: [0, 2, 1], 1: [1], 2: [2], 3: [4]}
请记住,无法保证按键顺序。
答案 2 :(得分:1)
有大量的解决方案。例如:
d = {0: [0,1], 1:[1],2:[2],3:[3]}
new_d = dict()
for k in d:
new_d[k] = sum([i == 0 and [0, 2] or i > 2 and \
[i + 1] or [i] for i in d[k]], [])
或
d = {0: [0,1], 1:[1],2:[2],3:[3]}
new_d = dict([(k, sum([i == 0 and [0, 2] or i > 2 \
and [i + 1] or [i] for i in v], [])) for k, v in d.items()])
答案 3 :(得分:1)
另一种替代解决方案:
d={0: [0,1], 1:[1],2:[2],3:[3]}
for k,a in d.items():
for key, digit in enumerate(a):
if digit == 0: a[key:key+1] = [0,2]
if digit > 2: a[key] += 1
print(d)
输出:
{0: [0, 2, 1], 1: [1], 2: [2], 3: [4]}
答案 4 :(得分:0)
“如何更新词典列表中的值?”是个好问题。假设我有一个列表字典,并且想更改其中一个列表中的值。
import copy
i = 1
input_sentence_dict = {i: []}
input_sentence_dict[1] = "['I', 'have', 'a', 'gift', 'for', 'Carmine', '.']"
input_sentence_dict[2] = "['I', 'gave', 'it', 'to', 'her', '.']"
import pprint
pp = pprint.PrettyPrinter(indent=4)
print('input_sentence_dict:')
pp.pprint(input_sentence_dict)
'''
input_sentence_dict:
{ 1: ['I', 'have', 'a', 'gift', 'for', 'Carmine', '.'],
2: ['I', 'gave', 'it', 'to', 'her', '.']}
'''
output_sentence_dict = copy.deepcopy(input_sentence_dict)
print('output_sentence_dict:')
pp.pprint(output_sentence_dict)
'''
output_sentence_dict:
{ 1: ['I', 'have', 'a', 'gift', 'for', 'Carmine', '.'],
2: ['I', 'gave', 'it', 'to', 'her', '.']}
'''
# example of indexing:
print(output_sentence_dict[2][1:3])
# ['gave', 'it']
通过索引,您可以轻松地在这些列表之一中更改值。例如:
output_sentence_dict[2][2] = 'a book'
pp.pprint(output_sentence_dict)
'''
{ 1: ['I', 'have', 'a', 'gift', 'for', 'Carmine', '.'],
2: ['I', 'gave', 'a book', 'to', 'her', '.']}
'''
注意。如果您仅复制字典(例如dict2 = dict1
),则对一个字典的编辑会影响另一个字典。您需要“深度复制”源词典,以确保您在真正不同的对象上工作,而不会干扰源对象。
import copy
dict2 = copy.deepcopy(dict1)
然后您可以编辑dict2
,而保留dict1
不变。
在以下StackOverflow线程中对此进行了很好的描述:How to copy a dictionary and only edit the copy
使用“浅拷贝”,例如
dict2 = dict1
# or
dict2 = dict(dict1)
将导致无提示错误。在上面的示例中,如果您不使用copy.deepcopy(dict)
,则对output_sentence_dict
所做的更改也将以静默方式传播到input_sentence_dict
。