【问题标题】:In python, how to group elements together, based on a key (group adjacent)?在python中,如何根据一个键(相邻组)将元素组合在一起?
【发布时间】:2013-07-07 19:03:18
【问题描述】:

python 中,我想根据一个键将元素组合在一起(在下面的示例中,键是第二个元素,或element[1])。

initial_array = [[10, 0], [30, 0], [40, 2], [20, 2], [90, 0], [80, 0]]

只有键相同且相邻的元素才应该组合在一起。

splited_array = [ [[10, 0], [30, 0]], 
                  [[40, 2], [20, 2]], 
                  [[90, 0], [80, 0]] ]

此外,我希望导致拆分的元素也位于前一个数组的末尾。

splited_array = [ [[10, 0], [30, 0], [40, 2]], 
                  [[40, 2], [20, 2], [90, 0]], 
                  [[90, 0], [80, 0]] ]

在 python 中最简单的方法是什么? (如果可能,重复使用Built-in Functions

【问题讨论】:

    标签: python arrays lambda split


    【解决方案1】:

    你可以使用itertools.groupby:

    >>> from itertools import groupby
    >>> from operator import itemgetter
    >>> lis = [[10, 0], [30, 0], [40, 2], [20, 2], [90, 0], [80, 0]]
    >>> [list(g) for k,g in groupby(lis, key=itemgetter(1))]
    [[[10, 0], [30, 0]],
     [[40, 2], [20, 2]],
     [[90, 0], [80, 0]]]
    

    第二个:

    >>> ans = []
    for k,g in groupby(lis, key=itemgetter(1)):
        l = list(g)
        ans.append(l)
        if len(ans) > 1:
            ans[-2].append(l[0])
    ...         
    >>> ans
    [[[10, 0], [30, 0], [40, 2]],
     [[40, 2], [20, 2], [90, 0]],
     [[90, 0], [80, 0]]]
    

    更新:

    >>> from itertools import zip_longest
    >>> lis = [[[10, 0], [30, 0]],
     [[40, 2], [20, 2]],
     [[90, 0], [80, 0]]]
    >>> [x + ([y[0]] if y else []) for x,y in 
                                            zip_longest(lis,lis[1:])]
    [[[10, 0], [30, 0], [40, 2]],
     [[40, 2], [20, 2], [90, 0]],
     [[90, 0], [80, 0]]]
    

    【讨论】:

    • 只为对itemgetter感兴趣的人:itemgetter(i) = lambda x: x[i]
    • @AshwiniChaudhary 我只是在阅读您的(优秀)答案。对于第二部分,有没有办法以不太命令的方式做到这一点,例如:不修改全局状态(ans 变量),而是使用一组获取和返回新数据集的函数(就像 groupby( ) 功能)。希望你明白我的意思。
    • 感谢您的快速回答。这就是我一直在寻找的。无论如何,在 Blender 2.67(Python 3.3)下执行“from itertools import izip_longest”时,我得到“ImportError:无法导入名称 izip_longest”。我在 ideone.com(支持 Python 3 的在线编译器)下尝试了相同的代码,但得到了相同的错误消息。有什么想法吗?
    • @tigrou 在 py3.x 中使用 zip_longest
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2017-12-05
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多