问题:
给出一份表格清单:
[((x1,y1,z1), (x2,y2,z2), variable_1, variable_2, variable_3),
((x3,y3,z3), (x1,y1,z1), variable_4, variable_5, variable_6),...
((x1,y1,z1), (xN,yN,zN), variable_M, variable_M+1, variable_M+2)]
将值(例如(x1,y1,z1)
)与另一个值(比如(xM,yM,zM)
)匹配的列表中的所有条目替换为最有效(并且最好是通用的,即任何列表)的方式是什么?< / p>
我的问题的核心是列表中的每个条目都由多个元素组成,我用来替换值的典型方法(例如[new_input if x == current else x for x in pairs]
)在这种情况下似乎没有用处。请注意每个条目的形式为:((x1,y1,z1), (x2,y2,z2), variable_1, variable_2, variable_3)
,列表为:[((x1,y1,z1), (x2,y2,z2), variable_1, variable_2, variable_3), ((x3,y3,z3), (x1,y1,z1), variable_4, variable_5, variable_6)]
。我正在寻找条目中的元素。
目前我正在使用一种可靠的粗制方法,其中列表被分成列,然后替换列表中的各个元素,然后再将列压缩回来。代码大致如下:
current=(x1,y1,z1)
new_input=(xM,yM,zM)
pairs=#list as above
def column(list, col_num):
return [column[col_num] for column in list]
p_c_1=column(pairs, 0)
p_c_2=column(pairs, 1)
p_c_3=column(pairs, 2)
p_c_4=column(pairs, 3)
p_c_5=column(pairs, 4)
for i in xrange(len(pairs)):
if p_c_1[i]==current:
p_c_1.remove(p_c_1[i])
p_c_1.insert(i,new_input)
if p_c_2[i]==current:
p_c_2.remove(p_c_2[i])
p_c_2.insert(i,new_input)
pairs=zip(p_c_1,p_c_2,p_c_3,p_c_4,p_c_5)
此方法产生输出:
[((xM,yM,zM), (x2,y2,z2), variable_1, variable_2, variable_3),
((x3,y3,z3), (xM,yM,zM), variable_4, variable_5, variable_6),...
((xM,yM,zM), (xN,yN,zN), variable_M, variable_M+1, variable_M+2)]
对于这种特殊情况,该方法已被证明是可靠的,但由于存在多个列表,其中各个条目由多个项组成,因此我必须为每个唯一列表构建一个新的代码,例如上面的代码,这看起来很粗糙。理想情况下,我希望每次更改条目时都避免反汇编和重新组合列表,或至少自动完成该过程。
解决此问题的最佳方法是什么?
注意: 理想情况下,解决方案能够处理列表条目中的任何元素的替换,而不仅仅是前两列。其他列表我不一定遵循上述格式。
答案 0 :(得分:2)
创建一个dict
,它是(要替换的东西)到(要替换它们的东西)的映射。
如果你没有在替换词中指定替换词,那么使用dict.get
制作新的列表理解就可以直接默认为现存值。
li = [('a','c','b'),('b','b','c'),('c','d'),'5',4]
d = {('b','b','c'):('b','b','b'),('c','d'):('c','c')}
[d.get(x,x) for x in li]
Out[33]: [('a', 'c', 'b'), ('b', 'b', 'b'), ('c', 'c'), '5', 4]
编辑,因为看起来你有一个奇特的数据结构(一个跨越整个list
的巨大元组),你可以这样做:
[tuple(d.get(x,x) for x in li[0])]
或者,如果你实际上有更多那些你没有展示的嵌套外元组,请尝试:
[tuple(d.get(x,x) for x in outer_tup) for outer_tup in li]
两者都会让你回到原始的元组列表(元组和其他东西)数据结构。