【问题标题】:python list: put all repeated items into one tuplepython list:将所有重复项放入一个元组中
【发布时间】:2015-01-15 21:55:56
【问题描述】:

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

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]

请帮帮我!

【问题讨论】:

  • 顺便说一句:这不是一件非常明智的事情。元组列表,即使其中一些只有长度 1,也比整数和元组的混合列表更容易处理。
  • 我试过这个:[(x, li[li.index(x)+1]) if x==li[li.index(x)+1] else x for x in李]。但这不是我想要的。考虑到实际列表是对象列表。

标签: python list python-3.x tuples


【解决方案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]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-29
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多