>我有这个带有元组的列表:
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
太容易与I
和1
混淆,最好避免。因此,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:
,因为这看起来可能不那么奇怪。