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

时间:2011-09-04 23:28:02

标签: data-structures 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的新手,并且不知道它是否正确。

你能帮帮我吗?谢谢!

4 个答案:

答案 0 :(得分:4)

这是一个涉及就地改变物品的解决方案。

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和我同意。)

答案 1 :(得分:3)

要创建新列表,列表理解会:

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')]

答案 2 :(得分:2)

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

>>> 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]

但是,正如第一条评论已经提到的那样,听起来你正试图让一个列表做一些你应该真正使用dict的东西。

答案 3 :(得分:2)

这是我将使用的方法。

>>> 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:,因为这可能看起来不那么奇怪。