【问题标题】:Finding and Replacing all Values inside of entries within a List查找和替换列表中条目内的所有值
【发布时间】:2013-11-13 20:32:20
【问题描述】:

问题:

给定一个表单列表:

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

用另一个值(比如(xM,yM,zM))替换列表中匹配一个值(比如(x1,y1,z1))的所有条目的最有效(并且最好是通用的,即对于任何列表)方法是什么?

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

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

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

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

【问题讨论】:

    标签: python list python-2.7 list-comprehension


    【解决方案1】:

    创建一个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]
    

    两者都可以让您回到原来的 list-of-tuples-of-(元组和其他事物)数据结构。

    【讨论】:

    • 感谢您的回复! :) 这看起来确实是我所追求的正确方向。如果我的列表是:li = [(('a','c','b'),('b','b','c'),('c','d'),'5',4)],那么这种映射方法将如何工作?我知道对于单个条目,您的解决方案将是完美的,但是如果我想更改条目 within 的元素,那该怎么办?对不起,如果我很密集。
    • @MarkyD43 那么您列表中的所有内容也都在一个大元组中?为什么?我的意思是,是的,这只是列表 comp 上的语法更改,但如果你摆脱那个毫无意义的外部元组会更好。
    • 它被写成一个大元组,因为每个条目都包含有关给定数据点的所有信息。即pairs[0] 返回与第一个数据点相关的所有信息。如果没有第二组括号,它将是一个连续列表。 (另外,更重要的是,这是我继承问题的格式(我正在更新别人的代码),重新编写代码将是一项艰巨的任务。
    • @MarkyD43 我明白了。如果我在编写那个 API,我会使用比元组更能自我记录的东西——比如 namedtuple!呃,好吧。我的底部编辑应该足以满足您的需求。
    • 非常感谢您的帮助!我会看看你的建议,再次感谢你:)
    猜你喜欢
    • 2018-06-09
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2016-12-05
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多