【问题标题】:Assorting elements in a list into a list of lists of specific lengths将列表中的元素分类为特定长度的列表列表
【发布时间】:2012-05-19 02:39:20
【问题描述】:

大家好,我正在使用 python,我只是想知道如何从原始元素列表中组合特定长度的列表?例如,我有一个原始列表["2H", "AH", "KH", "QH", "JH", "0H", "9H"],我有什么办法可以创建一个最终列表,其中包含所有特定长度的新分类列表(35)?

基本上从上面的原始列表,我想要一个返回的列表,如下所示:

[['9H', '0H', 'JH'], ['0H', 'JH', 'QH'], ['JH', 'QH', 'KH'], ['QH', 'KH', 'AH'], 
['KH', 'AH', '2H'], ['9H', '0H', 'JH', 'QH'], ['0H', 'JH', 'QH', 'KH'], 
['JH', 'QH', 'KH', 'AH'], ['QH', 'KH', 'AH', '2H'], ['9H', '0H', 'JH', 'QH', 'KH'], 
['0H', 'JH', 'QH', 'KH', 'AH'], ['JH', 'QH', 'KH', 'AH', '2H']]

谢谢!

【问题讨论】:

    标签: python list sorting split


    【解决方案1】:
    >>> from itertools import islice, chain
    >>> L = ["2H", "AH", "KH", "QH", "JH", "0H", "9H"]
    >>> list(chain.from_iterable(
            zip(*[islice(reversed(L),i,None) for i in range(j)])
            for j in range(3,6)))
    [('9H', '0H', 'JH'), ('0H', 'JH', 'QH'), ('JH', 'QH', 'KH'), ('QH', 'KH', 'AH'), 
     ('KH', 'AH', '2H'), ('9H', '0H', 'JH', 'QH'), ('0H', 'JH', 'QH', 'KH'), 
     ('JH', 'QH', 'KH', 'AH'), ('QH', 'KH', 'AH', '2H'), ('9H', '0H', 'JH', 'QH', 'KH'),
     ('0H', 'JH', 'QH', 'KH', 'AH'), ('JH', 'QH', 'KH', 'AH', '2H')]
    

    说明

    此解决方案基于 zip 的使用。

    >>> zip(L,L)
    [('2H', '2H'), ('AH', 'AH'), ('KH', 'KH'), ('QH', 'QH'), ('JH', 'JH'), ('0H', '0H'), ('9H', '9H')]
    

    这显示了zip 工作原理的示例,通过从其每个参数中获取一个项目。

    >>> zip(L,L[1:])
    [('2H', 'AH'), ('AH', 'KH'), ('KH', 'QH'), ('QH', 'JH'), ('JH', '0H'), ('0H', '9H')]
    

    从与第二个参数相同的列表的第一个项目开始,您可以获得每 2 个项目。

    >>> zip(L,L[1:],L[2:])
    [('2H', 'AH', 'KH'), ('AH', 'KH', 'QH'), ('KH', 'QH', 'JH'), ('QH', 'JH', '0H'), ('JH', '0H', '9H')]
    

    每 3 个项目相同。

    >>> zip(*[L[i:] for i in range(3)])
    [('2H', 'AH', 'KH'), ('AH', 'KH', 'QH'), ('KH', 'QH', 'JH'), ('QH', 'JH', '0H'), ('JH', '0H', '9H')]
    

    要自动执行此操作,您可以使用 * (splat) 从列表解析中获取 zip 的参数。

    在示例中,结果是反向的,所以reversed 给出了一个遍历列表的反向迭代器。要对迭代器进行切片,必须使用来自 itertools 的 isliceislice 采用可迭代对象,后跟索引以开始切片,并以索引结束切片。 None 可用于一直到迭代的末尾。

    >>> zip(*[islice(reversed(L),i,None) for i in range(3)])
    [('9H', '0H', 'JH'), ('0H', 'JH', 'QH'), ('JH', 'QH', 'KH'), ('QH', 'KH', 'AH'), ('KH', 'AH', '2H')]
    

    这样就给出了每 3 个项目的所有结果。现在需要每 4 和 5 个项目,因此对 range(3)range(4)range(5) 执行此操作。

    (zip(*[islice(reversed(L),i,None) for i in range(j)]) for j in range(3,6))
    

    这将为生成器提供每个345 的列表,但它们必须是一个列表。它们可以与chain.from_iterable 链接在一起,结果将转换为list

    【讨论】:

    • 只是想知道你有什么方法可以联系到你吗?脸书?
    • @AdhyKarina 哈哈哈我不知道该说什么不客气 :D 联系我的原因是什么?我不需要任何东西,谢谢就足够了:)
    • 因为你可以成为我可以在需要时寻求帮助的人。 :P 你能用简单的英语解释一下上面的代码是怎么做的吗?谢谢!
    • @AdhyKarina 我已经有足够的工作来帮助我自己的朋友了:D 我添加了一个解释,我认为最好通过示例来展示每一步,而不是用简单的英语。
    【解决方案2】:

    使用itertools

    import itertools
    
    original = ["2H", "AH", "KH", "QH", "JH", "0H", "9H"]
    
    result = itertools.chain()
    for size in range(3, 6):
        curr_subsets = itertools.combinations(original, size)
        result = itertools.chain(result, curr_subsets)
    
    result_as_list = list(result)
    

    【讨论】:

    • 这不起作用。它不会产生问题中列出的正确输出。
    • 它可能不会产生相同的输出,但它肯定会产生“来自原始元素列表的特定长度列表的组合”。由 OP 来准确指定他们想要的内容。如果排序是相关的,肯定不会在帖子的任何地方说明。
    • 使用“组合”这个词可能会产生误导,他只想要列表中的每 3、4 和 5 个项目。他确实在上面列出的所需输出中明确指定了他想要的内容。
    • 不,他应该是一个可接受的输出,但没有指定给定的输出正是他所需要的。反正问题不难,其他解决方案就好了。
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 2019-07-19
    • 2015-12-14
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多