替换列表/元组python的字典中的值

时间:2017-05-11 15:18:36

标签: python python-3.x dictionary tuples

我有这样的字典:

d = {}
d['key1'] = [('tuple1a', 'tuple1b', ['af1', 'af2', 'af3']),
            ('tuple2a', 'tuple2b', ['af4', 'af5', 'af6']),
            ('tuple3a', 'tuple3b', ['af7', 'af8', 'af9'])]      

我想编写一个函数来允许我更新值的列表部分(例如['af1','af2','af3'])。下面的代码用于过滤不同的值以获取值中的正确列表:

def update_dict(dictionary, key, tuple_a, tuple_b, new_list=None):

    for k,v in dictionary.items():
        if key in k:
            for i in v:
                if tuple_a in i:
                    if tuple_b in i:
                        #di.update(i[2], new_lst) #this is what I'd like to do but can't get the right syntax
    return dictionary

我想添加类似di.update(i[2], new_lst)的内容我的问题是如何只使用新列表更新列表值?

2 个答案:

答案 0 :(得分:1)

由于元组是不可变类型,因此无法更改元组中的单个条目。解决方法是创建一个列表,其中包含您希望在元组中使用的元素,然后从列表中创建一个元组。您还必须将新元组分配给父列表中的给定元素,如下所示:

for k,v in dictionary.items():
    if key in k:
        for n,tpl in enumerate(v):
            if tuple_a in tpl and tuple_b in tpl:
                v[n] = tuple( list(tpl)[:-1] + [new_list] )

(我对你的例子感到有点困惑,其中名为tuple_a和tuple_b的变量实际上是字符串。最好将它们称为name_a和name_b或类似的。)

答案 1 :(得分:1)

正如其他提到的,你不能改变元组中的单个条目。但元组中的列表仍然是可变的。

a = Sheet1.ComboBox1.value
If unit <> a Then
  If a = "mils" Then
    Set cx = Sheet9.range("E2", Sheet9.range("E2").End(xlDown))
    For Each rng In cx
      rng.value = rng.value * y
    Next ' <------------------------------ Missing
  Else
    Set cx = Sheet9.range("E2", Sheet9.range("E2").End(xlDown))
    For Each rng In cx
      rng.value = rng.value / y
    Next ' <------------------------------- Missing
  End If
End If

因此,根据您的需要,您可以执行以下操作:

>>> my_tuple = ('a', 'b', 'c', [1, 2, 3, 4, 5], 'd')
>>> my_tuple
('a', 'b', 'c', [1, 2, 3, 4, 5], 'd')
>>> my_tuple[3].pop()
5
>>> my_tuple[3].append(6)
>>> my_tuple
('a', 'b', 'c', [1, 2, 3, 4, 6], 'd')

因此,在您的代码中,将>>> my_tuple = ('a', 'b', 'c', [1, 2, 3, 4, 5], 'd') >>> newList = [10, 20, 30] >>> >>> del my_tuple[3][:] # Empties the list within >>> my_tuple ('a', 'b', 'c', [], 'd') >>> my_tuple[3].extend(newList) >>> my_tuple ('a', 'b', 'c', [10, 20, 30], 'd') 替换为

# di.update(i[2], new_lst)

我认为这也更快。