列表到基于列表中元素的元组列表?

时间:2017-12-13 21:53:34

标签: python list tuples

我有一个列表L = [1,2,3,5n,4,9,6n,1,3,4,5n]。

某些元素中的n表示分组的结束。有没有办法将此列表转换为元组列表?

例如,[(1,2,3,5n),(4,5,9,6n),(1,3,4,5n)]?

我知道我可以创建一个迭代器it = iter(L),然后压缩迭代器来创建一个元组列表,但我无法弄清楚如何使用“n”标志来表示元组的创建

n始终相同,始终表示分组的结束。谢谢!

编辑:列表中的所有元素都是字符串,输出也应该是字符串的元组。

2 个答案:

答案 0 :(得分:3)

假设你的名单如下:

l = [1, 2, 3, '5n', 4, 9, '6n', 1, 3, 4, '5n']
[tuple(x) for x in ''.join(map(str,l)).split('n') if x]
Out[1]: [('1', '2', '3', '5'), ('4', '9', '6'), ('1', '3', '4', '5')]

@Matias Cicero提到的另一种方式

list(map(tuple, filter(lambda x: x, ''.join(map(str, l)).split('n'))))

答案 1 :(得分:2)

使用itertools.groupby

的一种方法
from itertools import groupby
l =  [1, 2, 3, '5n', 4, 5, 9, '6n', 1, 3, 4, '5n']
grp = [list(g) for k,g in groupby(l, lambda x:'n' in str(x))]
[tuple(i+j) for i, j in zip(grp[::2],grp[1::2])]
#[(1, 2, 3, '5n'), (4, 5, 9, '6n'), (1, 3, 4, '5n')]

根据你的评论要求,我会选择循环

lst =  [1, 2, 3, '5n', '6n', 1, 3, 4, '5n']
l = []
l1 = []
for i in lst:
    if 'n' in str(i):
        l.append(i)
        l1.append(l)
        l = []
    else:
        l.append(i)
print (l1)
#[[1, 2, 3, '5n'], ['6n'], [1, 3, 4, '5n']]

或使用re.findall适用于您的两个列表

import re
L = [1, 2, 3, '5n', 4, 5, 9, '6n', 1, 3, 4, '5n']
s = ':'.join(map(str,L))
[tuple(i.split(':')) for i in re.findall(r'([^:].*?n)', s)]
#[('1', '2', '3', '5n'), ('4', '5', '9', '6n'), ('1', '3', '4', '5n')]