0

问题:

给定一个表格列表:

[((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)什么?

我的问题的核心是列表中的每个条目都由多个元素组成,而我用来替换值的典型方法(例如[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)]

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

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

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

4

1 回答 1

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]

两者都可以让您回到原始的元组列表(元组和其他事物)数据结构。

于 2013-11-13T20:44:59.010 回答