Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python列表:将所有重复项放入一个元组中_Python_List_Python 3.x_Tuples - Fatal编程技术网

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

python列表:将所有重复项放入一个元组中,python,list,python-3.x,tuples,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] 请帮帮我 您可以使用将列表中的连续相等值组合在一起。这允许您首先获得包含连续值的元组列表;从长远来看,这可能(也可能不是)更容易处理 >>> import itertools >>

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

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]
请帮帮我

您可以使用将列表中的连续相等值组合在一起。这允许您首先获得包含连续值的元组列表;从长远来看,这可能(也可能不是)更容易处理

>>> 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的元组,可以在
元组上运行另一个列表:

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

只是另一种不使用任何外部lib的方法。 代码如下:

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

旁白:这不是一件很明智的事情。元组列表,即使其中一些只有长度1,也比整数和元组的混合列表更容易处理。我试过:[(x,li[li.index(x)+1]),如果x==li[li.index(x)+1]或者x代表li中的x]。但这不是我想要的。考虑实际列表是一个对象列表。