Python:修改列表元素的正确方法是什么?



>我有这个带有元组的列表:

l = [('a','b'),('c','d'),('e','f')]

还有两个参数:一个键值和一个要修改的新值。例如

key = 'a'
new_value= 'B' # it means, modify with 'B' the value in tuples where there's an 'a'

我有两个选项(都有效(:

f = lambda t,k,v: t[0] == k and (k,v) or t 
new_list = [f(t,key,new_value) for t in l]
print new_list 

new_list = []
for i in range(len(l)):
    elem = l.pop()
    if elem[0] == key:
        new_list.append((key,new_value))
    else:
        new_list.append(elem)
print new_list

但是,我是Python的新手,不知道它是否正确。

你可以帮我吗?谢谢!

这是一个涉及就地更改项目的解决方案。

def replace(list_, key, new_value):
    for i, (current_key, current_value) in enumerate(list_):
        if current_key == key:
            list_[i] = (key, new_value)

或者,如果它不在那里,则附加,

def replace_or_append(list_, key, new_value):
    for i, (current_key, current_value) in enumerate(list_):
        if current_key == key:
            list_[i] = (key, new_value)
            break
    else:
        list_.append((key, new_value))

用法:

>>> my_list = [('a', 'b'), ('c', 'd')]
>>> replace(my_list, 'a', 'B')
>>> my_list
[('a', 'B'), ('c', 'd')]

如果要创建新列表,列表推导是最容易的。

>>> my_list = [('a', 'b'), ('c', 'd')]
>>> find_key = 'a'
>>> new_value = 'B'
>>> new_list = [(key, new_value if key == find_key else value) for key, value in my_list]
>>> new_list
[('a', 'B'), ('c', 'd')]

如果您希望它不存在时附加,

>>> if len(new_list) == len(my_list):
...     new_list.append((find_key, new_value))

(另请注意,我已将您的变量名称从 l ; l太容易与I1混淆,最好避免。因此,PEP8 和我同意它。

要创建一个新列表,列表推导可以:

In [102]: [(key,'B' if key=='a' else val) for key,val in l]
Out[102]: [('a', 'B'), ('c', 'd'), ('e', 'f')]

就地修改列表:

l = [('a','b'),('c','d'),('e','f')]
for i,elt in enumerate(l):
    key,val=elt
    if key=='a':
        l[i]=(key,'B')
print(l)              
# [('a', 'B'), ('c', 'd'), ('e', 'f')]

要修改现有列表,只需使用列表分配,例如

>>> l = [('a','b'),('c','d'),('e','f')]
>>> l[0] = ('a','B')
>>> print l
[('a', 'B'), ('c', 'd'), ('e', 'f')]

我通常更愿意使用理解创建一个新列表,例如

[(key, new_value) if x[0] == key else x for x in l]

但是,正如第一条评论已经提到的,听起来您正在尝试使列表做一些您应该真正使用字典的事情。

这是我将使用的方法。

>>> l = [('a','b'),('c','d'),('e','f')]
>>> key = 'a'
>>> new_value= 'B'
>>> for pos in (index for index, (k, v) in enumerate(l) if k == key):
...     l[pos] = (key, new_value)
...     break
... else:
...     l.append((key, new_value))
... 
>>> l
[('a', 'B'), ('c', 'd'), ('e', 'f')]

不过,这看起来很像OrderedDict;键值对保留排序。 您可能想看看它,看看它是否适合您的需求

编辑:替换try:...except StopIteration:for:...break......else:,因为这看起来可能不那么奇怪。

相关内容

最新更新