【问题标题】:Conditionally merge lists有条件地合并列表
【发布时间】:2012-09-07 15:11:19
【问题描述】:

假设我有两个列表

[16, 0, 0, ';', 17, 0, 2, ';', 0, 2, 1, ';']
  [-1, 0, ';', 0, -2, ';', -2, -1, ';']

有没有一种更简单的方法可以在满足';'时有条件地合并这些列表元素字符而不是单独遍历它们并将它们组合起来?

输出应该是

[16, 0, 0, -1, 0, ';', 17, 0, 2, 0, -2, ';', 0, 2, 1, -2, -2,';']

【问题讨论】:

  • 当然,感谢您指出这一点

标签: python list merge conditional


【解决方案1】:
def get_part(lst,sep=';'):
    out = []
    for i in lst:
        if i == sep:
           yield out
           out = []
        else:
           out.append(i)

现在我们可以将您的列表压缩在一起:

merged = []
for l1,l2 in zip(get_part(list1),get_part(list2)):
    merged.extend(l1)
    merged.extend(l2)
    merged.append(';')

当然,从本质上讲,这本质上是对它们两者进行迭代并结合......所以在回答你的问题时,我认为没有更好的方法。


也许存储列表的更好方法是将它们存储为列表列表 - 例如:

list1 = [[16, 0, 0], [ 17, 0, 2], [ 0, 2, 1] ]

这样存储,你可以这样做:

merged = [ l1 + l2 for l1,l2 in zip(list1,list2) ]

【讨论】:

    【解决方案2】:
    >>> from itertools import groupby, izip, chain
    >>> L1=[16, 0, 0, ';', 17, 0, 2, ';', 0, 2, 1, ';']
    >>> L2=[-1, 0, ';', 0, -2, ';', -2, -1, ';']    
    >>> g1 = groupby(L1, key=';'.__eq__)
    >>> g2 = groupby(L2, key=';'.__eq__)
    >>> [i for i1,i2 in izip(g1, g2) for i in ([';'] if i1[0] is True else chain(i1[1], i2[1]))]
    [16, 0, 0, -1, 0, ';', 17, 0, 2, 0, -2, ';', 0, 2, 1, -2, -1, ';']
    

    【讨论】:

      【解决方案3】:

      更多 itertools 疯狂:

      from itertools import groupby, chain, izip, repeat
      
      a = [16, 0, 0, ';', 17, 0, 2, ';', 0, 2, 1, ';']
      b = [-1, 0, ';', 0, -2, ';', -2, -1, ';']
      
      wanted = [16, 0, 0, -1, 0, ";",
                17, 0, 2, 0, -2, ';',
                0, 2, 1, -2, -1,";"]
      
      def split(items, sep=";"):
          return (group for key, group in
                  groupby(items, lambda item: item != sep) if key)
      
      got = list(
          chain.from_iterable(
              chain.from_iterable(
                  izip(split(a), split(b), repeat([";"])))))
      assert got == wanted
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-26
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        • 2017-08-02
        • 1970-01-01
        相关资源
        最近更新 更多