Python - 在列表中查找相同的值并将新列表组合在一起

时间:2015-05-17 23:11:25

标签: python list duplicates append

我很难搞清楚这一点并想知道是否有人能指出我正确的方向......

从此列表中:

scala > var query = csc.sql("select * from users");
scala > query.collect().foreach(println)

我试图创建:

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]

任何被发现相同的值都被分组到它自己的子列表中。 这是我到目前为止的尝试,我认为我应该使用L = [[1],[2,2],[3,3,3],[4,4,4,4],[5,5,5,5,5]] 循环?

while

6 个答案:

答案 0 :(得分:30)

保持冷静并使用itertools.groupby

from itertools import groupby

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]

print([list(j) for i, j in groupby(N)])

<强>输出:

[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]

附注:当您不需要时,防止使用全局变量。

答案 1 :(得分:15)

有人提及N=[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 1]它将获得[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5], [1]]

换句话说,当列表中的数字按顺序排列或者是一个混乱列表时,它就不可用。

所以我有更好的答案来解决这个问题。

from collections import Counter

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
C = Counter(N)

print [ [k,]*v for k,v in C.items()]

答案 2 :(得分:4)

您可以将itertools.groupbylist comprehension

一起使用
>>> l =  [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
>>> [list(v) for k,v in itertools.groupby(l)]
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]

可以像

一样将其分配给变量L
L = [list(v) for k,v in itertools.groupby(l)]

答案 3 :(得分:3)

你过度复杂了。

您要做的是:对于每个值,如果它与最后一个值相同,只需将其附加到最后一个值列表中;否则,创建一个新列表。您可以将该英语直接翻译成Python:

new_list = []
for value in old_list:
    if new_list and new_list[-1][0] == value:
        new_list[-1].append(value)
    else:
        new_list.append([value])

如果您愿意更加抽象,例如使用itertools中的分组功能,甚至可以采用更简单的方法。但这应该很容易理解。

如果您确实需要使用while循环执行此操作,则可以将任何for循环转换为while循环,如下所示:

for value in iterable:
    do_stuff(value)

iterator = iter(iterable)
while True:
    try:
        value = next(iterator)
    except StopIteration:
        break
    do_stuff(value)

或者,如果你知道iterable是一个序列,你可以使用一个稍微简单的while循环:

index = 0
while index < len(sequence):
    value = sequence[index]
    do_stuff(value)
    index += 1

但这两种方法都会降低你的代码的可读性,减少Pythonic,更复杂,效率更低,更容易出错等等。

答案 4 :(得分:0)

您也可以使用numpy来做到这一点:

import numpy as np

N = np.array([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
counter = np.arange(1, np.alen(N))
L = np.split(N, counter[N[1:]!=N[:-1]])

此方法的优点是,当您有另一个与N相关的列表并且想要以相同的方式拆分时。

答案 5 :(得分:-1)

另一个稍微不同的解决方案,它不依赖于itertools:

#!/usr/bin/env python

def group(items):
    """
    groups a sorted list of integers into sublists based on the integer key
    """
    if len(items) == 0:
        return []

    grouped_items = []
    prev_item, rest_items = items[0], items[1:]

    subgroup = [prev_item]
    for item in rest_items:
        if item != prev_item:
            grouped_items.append(subgroup)
            subgroup = []
        subgroup.append(item)
        prev_item = item

    grouped_items.append(subgroup)
    return grouped_items

print group([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
# [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]