如果我有一个清单:
my_list = [3,2,2,3,4,1,3,4]
和一个元组
my_tuple = (3,5)
使用元组替换my_list
中元素的最佳方法是什么:
result = [5,2,2,5,4,1,5,4]
e.g。
for item in my_list:
if(item == my_tuple[0]):
item = my_tuple[1]
更一般地说,我会有一个列表列表和一个元组列表,我想将每个元组应用于列表列表中的每个列表。
答案 0 :(得分:11)
my_tuple
更自然的数据结构是字典。考虑这样的事情并使用.get()
方法:
>>> my_lists = [[3,2,2,3,4,1,3,4], [1,2,3,4,5,6]]
>>> my_tuple_list = [(3,5), (6, 7)]
>>> my_dict = dict(my_tuple_list)
>>> my_dict
{3: 5, 6: 7}
>>> my_lists = [[my_dict.get(x,x) for x in somelist] for somelist in my_lists]
>>> my_lists
[[5, 2, 2, 5, 4, 1, 5, 4], [1, 2, 5, 4, 5, 7]]
答案 1 :(得分:3)
Per @ Wooble的评论,如果你枚举,你的代码将会起作用。
list_of_lists = [[3,2,2,3,4,1,3,4], [1,3,5,3,4,6,3]]
list_of_tuples = [(3,5), (1,9)]
def tup_replace(mylist, mytuple):
for i, item in enumerate(mylist):
if item == mytuple[0]:
mylist[i] = mytuple[1]
return mylist
然后你可以嵌套更多的东西来处理列表和元组列表。
for mylist in list_of_lists:
for mytuple in list_of_tuples:
mylist = tup_replace(mylist, mytuple)
print mylist
也就是说,字典方法可能更好。
答案 2 :(得分:1)
如果您尝试使用3
替换列表中的每个5
,则会执行以下操作:
[x == my_tuple[0] and my_tuple[1] or x for x in my_list]
如果你想这样做,有多个“转化”元组,那么我真的建议改用词典:
trans = {3: 5, 4: 6}
[trans.get(x,x) for x in my_list]
在更一般的情况下,您有多个列表:
ll = [[3, 2, 3, 4], [5, 4, 3, 4]]
trans = {3: 5, 4: 6}
for i in range(len(ll)):
ll[i] = [trans.get(x,x) for x in ll[i]]
假设您要将ll
中的每个旧列表替换为新列表。
答案 3 :(得分:1)
使用if item == my_tuple [0],...在一般情况下听起来好像是在制作一个要应用于列表中每个项目的switch语句。如果可以,请使用字典。 (Why isn't there a switch or case statement in python?)
将元组列表转换为查找字典(python的switch语句):
replacements = dict(my_tuples) #thanks to @julio
然后对于单个列表,使用理解重现列表,但是如果存在替换,则用替换中的新值替换每个值:
replaced_list = [replacements.get(original,original) for original in my_list]
我想有一种更有效的方法可以做到这一点,但这是针对带有元组列表的单个列表。你说你还需要为列表列表做这件事吗?那窝吗?
您能否详细解释一下您获取此数据的位置以及需要执行此操作的原因?