我列出了元组:
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的新手,并且不知道它是否正确。
你能帮帮我吗?谢谢!答案 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
太容易与I
和1
混淆,最好避免使用。因此,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:
,因为这可能看起来不那么奇怪。