python 列表:将所有重复的项放入一个元组中

python list: put all repeated items into one tuple

我将我的问题简化为: 我有一个项目列表,我想将所有连续重复的项目放入一个元组中。

li = [1, 2, 2, 3, 4, 4, 4, 3, 5, 5, 1]
# now i want this:
result = [1, (2,2), 3, (4, 4, 4), 3, (5, 5), 1]

请帮帮我!

您可以使用 itertools.groupby 将列表中的连续相等值组合在一起。这允许您首先获得包含连续值的元组列表;这可能(或可能不会)在长 运行.

中更容易使用
>>> import itertools
>>> li = [1, 2, 2, 3, 4, 4, 4, 3, 5, 5, 1]
>>> tups = [tuple(t) for _, t in itertools.groupby(li)]

tups 是一个元组列表,如下所示:

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

要用单个元素替换所有长度为 1 的元组,您可以 运行 另一个列表理解 tups:

>>> [x[0] if len(x) == 1 else x for x in tups]
[1, (2, 2), 3, (4, 4, 4), 3, (5, 5), 1]

不使用任何外部库的另一种方式。 这是代码:

#!/usr/bin/python
a=[1,2,3,3,4,4,4,5,5,6,6,6,6,7]
print a
result=[]
buff=()
for i in a:
    if a.count(i)==1:
        result.append(i)
    else:
        for j in xrange(a.count(i)):
            buff += (i,)
        if not buff in result:
            result.append(buff)
        buff=()
print result

现在让我们深入探讨一下

 for i in a:
        if a.count(i)==1:
            result.append(i)

如果元素只遇到一次,就把它放入结果列表

    else:
        for j in xrange(a.count(i)):
            buff += (i,)
        if not buff in result:
            result.append(buff)
        buff=()

如果元素在列表中遇到不止一次,则计算多少次,然后创建一个元组,如果结果列表中没有这样的元组,则将其添加到结果列表并输出结果。

    [1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7]
    [1, 2, (3, 3), (4, 4, 4), (5, 5), (6, 6, 6, 6), 7]