查找和替换List中条目内的所有值

时间:2013-11-13 20:32:21

标签: python list python-2.7 list-comprehension

问题:

给出一份表格清单:

[((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)]

对于这种特殊情况,该方法已被证明是可靠的,但由于存在多个列表,其中各个条目由多个项组成,因此我必须为每个唯一列表构建一个新的代码,例如上面的代码,这看起来很粗糙。理想情况下,我希望每次更改条目时都避免反汇编和重新组合列表,或至少自动完成该过程。

解决此问题的最佳方法是什么?

注意: 理想情况下,解决方案能够处理列表条目中的任何元素的替换,而不仅仅是前两列。其他列表我不一定遵循上述格式。

1 个答案:

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

两者都会让你回到原始的元组列表(元组和其他东西)数据结构。