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]。但这不是我想要的。考虑实际列表是一个对象列表。