【问题标题】:iterating through a list to append a value to variable lists遍历列表以将值附加到变量列表
【发布时间】:2012-10-05 20:12:33
【问题描述】:

我有以下数据:

data = [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']]

我想遍历列表列表以生成元组列表。

new_data = [('AB', 'BS'), ('AB', 'BT'), ('AH', 'AH'), ('AS', 'AS') ('AS', 'GS')]

我正在考虑使用 zip() 函数,但不确定我是否使用了正确的逻辑。

【问题讨论】:

    标签: python list append tuples loops


    【解决方案1】:

    zip 不会是我的首选。我的第一选择是itertools.product 和itertools.chain

    In [103]: data = [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']]
    
    In [104]: [list(itertools.product([d[0]], d[1].split(','))) for d in data]
    Out[104]: [[('AB', 'BS'), ('AB', ' BT')], [('AH', 'AH')], [('AS', 'AS'), ('AS', ' GS')]]
    
    In [105]: list(itertools.chain.from_iterable([list(itertools.product([d[0]], d[1].split(','))) for d in data]))
    Out[105]: [('AB', 'BS'), ('AB', ' BT'), ('AH', 'AH'), ('AS', 'AS'), ('AS', ' GS')]
    

    希望对你有帮助

    【讨论】:

    • itertools.product 是这样做的好方法,+1。值得注意的是,在正常使用中,您不需要额外的list() 调用。
    • 我绝对可以看到内部调用是多余的。但是不需要外部的list 调用吗?
    • 如果严格需要一个列表,是的,但 99% 的时间是迭代器完成这项工作。
    【解决方案2】:

    使用zip():

    In [32]: data
    Out[32]: [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']]
    
    In [33]: [zip([x[0]]*len(x[1].split(",")),x[1].split(",")) for x in data]
    Out[33]: [[('AB', 'BS'), ('AB', ' BT')], [('AH', 'AH')], [('AS', 'AS'), ('AS', ' GS')]]
    

    使用chain() 得到预期的输出:

    In [34]: lis=[zip([x[0]]*len(x[1].split(",")),x[1].split(",")) for x in data]
    
    In [35]: list(chain(*lis))
    Out[35]: [('AB', 'BS'), ('AB', ' BT'), ('AH', 'AH'), ('AS', 'AS'), ('AS', ' GS')]
    

    使用izip_longest,fillvalue 等于每个子列表的第一个元素:

    In [47]: from itertools import chain,izip_longest
    
    In [48]: lis=[tuple(izip_longest([x[0]],x[1].split(","),fillvalue=x[0])) for x in data]
    
    In [49]: lis
    Out[49]: [(('AB', 'BS'), ('AB', ' BT')), (('AH', 'AH'),), (('AS', 'AS'), ('AS', ' GS'))]
    
    In [50]: list(chain(*lis))
    Out[50]: [('AB', 'BS'), ('AB', ' BT'), ('AH', 'AH'), ('AS', 'AS'), ('AS', ' GS')]
    

    【讨论】:

      【解决方案3】:

      这可以通过itertools.repeat() 轻松完成。我们使用它来为每个其他项目重复第一个项目,我们通过在"," 上拆分得到它,然后压缩以生成我们的元组。然后我们使用itertools.chain.from_iterable() 生成一个列表。

      >>> import itertools
      >>> data = [['AB', 'BS, BT'], ['AH', 'AH'], ['AS', 'AS, GS']]
      >>> for item in itertools.chain.from_iterable(zip(itertools.repeat(first), second.split(",")) for first, second in data):
      ...     print(item)
      ... 
      ('AB', 'BS')
      ('AB', ' BT')
      ('AH', 'AH')
      ('AS', 'AS')
      ('AS', ' GS')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 2018-10-28
        • 2022-07-06
        • 2014-02-14
        相关资源
        最近更新 更多