我将我的问题简化为: 我有一个项目列表,我想将所有连续重复的项目放入一个元组。
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]
请帮助我!
答案 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]