【问题标题】:List to list of tuples based on elements in list?根据列表中的元素列出元组列表?
【发布时间】:2017-12-13 21:53:33
【问题描述】:

我有一个列表 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 总是相同的并且总是表示分组的结束。谢谢!

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

【问题讨论】:

  • 正则匹配?
  • 您的列表将不起作用,因为 5n 不提供 Python 已知的任何类型。它可以是 ['1', '2', '3', '5n'] 或 [1, 2, 3, '5n']。
  • 如果这些是字符串,你可以使用if element.endswith('n')
  • 列表的所有元素都是字符串,如果需要我可以更改。
  • 创建元组直到 n 然后将元组附加到新列表中。你什么都没试过,是吗?

标签: python list tuples


【解决方案1】:

假设您的列表如下:

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'))))

【讨论】:

  • 我认为这是正确的,但从问题来看,他们似乎希望将'n' 包含在元组中。
  • 是的。我认同。等待他更正输入。我不确定他期望的确切输出。
  • if x!='' => if x
  • 这工作正常,谢谢!我会在几分钟后接受。
  • 如果你想坚持使用函数式方法,你可以像这样实现同样的事情:map(tuple, filter(lambda x: x, ''.join(map(str, l)).split('n')))
【解决方案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')]

【讨论】:

  • 这实际上是一个更好的答案。后续问题:如果列表中有 [1, 2, 3, 5n, 6n, 7, 8, 9n] 的实例怎么办?我希望 6n 在它自己的元组中,而不是被添加到第一个元组中。
  • 这就是我在 cmets 中所说的。起来!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2018-07-14
  • 1970-01-01
  • 2016-12-19
  • 2018-04-15
  • 2017-04-19
相关资源
最近更新 更多