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

时间:2015-01-15 21:55:56

标签: python list python-3.x tuples

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

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]

请帮助我!

2 个答案:

答案 0 :(得分:4)

您可以使用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]

答案 1 :(得分:0)

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

#!/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]