如何更新列表字典中的值

时间:2016-12-28 13:22:20

标签: python dictionary

我正在尝试更新列表字典中的值 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

我如何实现这一目标? 在此先感谢您的任何帮助

5 个答案:

答案 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