如何将列表拆分为元组

时间:2018-11-30 03:00:17

标签: python python-3.x

如果我有列表

lst = ['a', 'k', 'b', 'c', 'k', 'd', 'e', 'g']  

,我想拆分成不带'k'的新列表,并将其变成一个元组。所以我得到

(['a'],['b', 'c'], ['d', 'e', 'g'])

我正在考虑先使用for循环将它们分成不同的列表。

new_lst = []
for element in lst:
    if element != 'k':
        new_ist.append(element)

这确实删除了所有的“ k”,但它们都在一起。我不知道如何将它们分成不同的列表。要将列表变成元组,我需要在列表内创建一个列表

a = [['a'],['b', 'c'], ['d', 'e', 'g']]
tuple(a) == (['a'], ['b', 'c'], ['d', 'e', 'g'])
True

所以问题是如何将列表分为带有子列表的列表。

7 个答案:

答案 0 :(得分:5)

您很近。您可以附加到另一个名为sublist的列表,如果找到k,则将sublist附加到new_list

lst = ['a', 'k', 'b', 'c', 'k', 'd', 'e', 'g']

new_lst = []
sublist = []
for element in lst:
    if element != 'k':
        sublist.append(element)
    else:
        new_lst.append(sublist)
        sublist = []

if sublist: # add the last sublist
    new_lst.append(sublist)

result = tuple(new_lst) 
print(result)
# (['a'], ['b', 'c'], ['d', 'e', 'g'])

如果您喜欢冒险,也可以使用groupby。想法是将元素分组为“ k”或“ non-k”,并在该属性上使用groupby

from itertools import groupby

lst = ['a', 'k', 'b', 'c', 'k', 'd', 'e', 'g']
result = tuple(list(gp) for is_k, gp in groupby(lst, "k".__eq__) if not is_k)

print(result)
# (['a'], ['b', 'c'], ['d', 'e', 'g'])

感谢@YakymPirozhenko提供更简单的生成器表达式

答案 1 :(得分:3)

tuple(list(i) for i in ''.join(lst).split('k'))

输出:

(['a'], ['b', 'c'], ['d', 'e', 'g'])

答案 2 :(得分:1)

smallerlist = [l.split(',') for l in ','.join(lst).split('k')]
print(smallerlist)

输出

[['a', ''], ['', 'b', 'c', ''], ['', 'd', 'e', 'g']]

然后,您可以检查每个子列表是否包含“

smallerlist = [' '.join(l).split() for l in smallerlist]
print(smallerlist)

输出

[['a'], ['b', 'c'], ['d', 'e', 'g']]  

答案 3 :(得分:1)

这是另一种方法,使用re.split模块中的remap

import re

lst = ['a', 'k', 'b', 'c', 'k', 'd', 'e', 'g']

tuple(map(list, re.split('k',''.join(lst))))

(['a'], ['b', 'c'], ['d', 'e', 'g'])

答案 4 :(得分:0)

如何切片,而无需附加和联接。

//This is working
using(var tc = new TestContext()){
    var tempClass = person.Class;
    person.Class = null;
    tc.Persons.Attach(person);
    person.Class = tempClass;
    tc.SaveChanges();
}

答案 5 :(得分:0)

尝试一下,就可以了,不需要任何导入!

>>> l = ['a', 'k', 'b', 'c', 'k', 'd', 'e', 'g']
>>> t = []
>>> for s in ''.join(l).split('k'):
...     t.append(list(s))
...
>>> t
[['a'], ['b', 'c'], ['d', 'e', 'g']]
>>> t = tuple(t)
>>> t
(['a'], ['b', 'c'], ['d', 'e', 'g'])

为什么不创建一个将列表作为参数并返回元组的方法呢?

>>> def list_to_tuple(l):
...     t = []
...     for s in l:
...             t.append(list(s))
...     return tuple(t)
...
>>> l = ['a', 'k', 'b', 'c', 'k', 'd', 'e', 'g']
>>> l = ''.join(l).split('k')
>>> l = list_to_tuple(l)
>>> l
(['a'], ['b', 'c'], ['d', 'e', 'g'])

答案 6 :(得分:0)

另一种使用 itertools 的方法

import more_itertools

lst = ['a', 'k', 'b', 'c', 'k', 'd', 'e', 'g']

print(tuple(more_itertools.split_at(lst, lambda x: x == 'k')))

给予

(['a'], ['b', 'c'], ['d', 'e', 'g'])