在Python3中对列表中的列表进行分组
我有一个字符串列表,如下所示:在Python3中对列表中的列表进行分组,python,list,python-3.x,Python,List,Python 3.x,我有一个字符串列表,如下所示: List1 = [ ['John', 'Doe'], ['1','2','3'], ['Henry', 'Doe'], ['4','5','6'] ] 我想变成这样: List1 = [ [ ['John', 'Doe'], ['1','2','3'] ], [ ['Henry', 'Doe'], ['4','5','6'
List1 = [
['John', 'Doe'],
['1','2','3'],
['Henry', 'Doe'],
['4','5','6']
]
我想变成这样:
List1 = [
[ ['John', 'Doe'], ['1','2','3'] ],
[ ['Henry', 'Doe'], ['4','5','6'] ]
]
但我似乎很难做到这一点。这应该可以满足您的要求,假设您总是希望将成对的内部列表放在一起
list1 = [['John', 'Doe'], ['1','2','3'], ['Henry', 'Doe'], ['4','5','6']]
output = [list(pair) for pair in zip(list1[::2], list1[1::2])]
它使用zip,它提供元组,但是如果您需要它,正如您在列表中所显示的那样,外部列表理解就可以做到这一点。假设您总是希望将内部列表成对地放在一起,那么这应该可以满足您的需要
list1 = [['John', 'Doe'], ['1','2','3'], ['Henry', 'Doe'], ['4','5','6']]
output = [list(pair) for pair in zip(list1[::2], list1[1::2])]
List1 = [['John', 'Doe'], ['1','2','3'],
['Henry', 'Doe'], ['4','5','6'],
['Bob', 'Opoto'], ['10','11','12']]
def pairing(iterable):
it = iter(iterable)
itn = it.next
for x in it :
yield (x,itn())
# The generator pairing(iterable) yields tuples:
for tu in pairing(List1):
print tu
# produces:
(['John', 'Doe'], ['1', '2', '3'])
(['Henry', 'Doe'], ['4', '5', '6'])
(['Bob', 'Opoto'], ['8', '9', '10'])
# If you really want a yielding of lists:
from itertools import imap
# In Python 2. In Python 3, map is a generator
for li in imap(list,pairing(List1)):
print li
# or defining pairing() precisely so:
def pairing(iterable):
it = iter(iterable)
itn = it.next
for x in it :
yield [x,itn()]
# produce
[['John', 'Doe'], ['1', '2', '3']]
[['Henry', 'Doe'], ['4', '5', '6']]
[['Bob', 'Opoto'], ['8', '9', '10']]
它使用zip,它提供元组,但是如果您需要它,正如您在列表中所显示的那样,外部列表理解可以做到这一点
List1 = [['John', 'Doe'], ['1','2','3'],
['Henry', 'Doe'], ['4','5','6'],
['Bob', 'Opoto'], ['10','11','12']]
def pairing(iterable):
it = iter(iterable)
itn = it.next
for x in it :
yield (x,itn())
# The generator pairing(iterable) yields tuples:
for tu in pairing(List1):
print tu
# produces:
(['John', 'Doe'], ['1', '2', '3'])
(['Henry', 'Doe'], ['4', '5', '6'])
(['Bob', 'Opoto'], ['8', '9', '10'])
# If you really want a yielding of lists:
from itertools import imap
# In Python 2. In Python 3, map is a generator
for li in imap(list,pairing(List1)):
print li
# or defining pairing() precisely so:
def pairing(iterable):
it = iter(iterable)
itn = it.next
for x in it :
yield [x,itn()]
# produce
[['John', 'Doe'], ['1', '2', '3']]
[['Henry', 'Doe'], ['4', '5', '6']]
[['Bob', 'Opoto'], ['8', '9', '10']]
编辑:不需要定义生成器函数,您可以动态配对列表:
List1 = [['John', 'Doe'], ['1','2','3'],
['Henry', 'Doe'], ['4','5','6'],
['Bob', 'Opoto'], ['8','9','10']]
it = iter(List1)
itn = it.next
List1 = [ [x,itn()] for x in it]
编辑:不需要定义生成器函数,您可以动态配对列表:
List1 = [['John', 'Doe'], ['1','2','3'],
['Henry', 'Doe'], ['4','5','6'],
['Bob', 'Opoto'], ['8','9','10']]
it = iter(List1)
itn = it.next
List1 = [ [x,itn()] for x in it]
这里有8行。我使用元组而不是列表,因为这是“正确”的做法:
def pairUp(iterable):
"""
[1,2,3,4,5,6] -> [(1,2),(3,4),(5,6)]
"""
sequence = iter(iterable)
for a in sequence:
try:
b = next(sequence)
except StopIteration:
raise Exception('tried to pair-up %s, but has odd number of items' % str(iterable))
yield (a,b)
演示:
简明方法:
这里有8行。我使用元组而不是列表,因为这是“正确”的做法:
def pairUp(iterable):
"""
[1,2,3,4,5,6] -> [(1,2),(3,4),(5,6)]
"""
sequence = iter(iterable)
for a in sequence:
try:
b = next(sequence)
except StopIteration:
raise Exception('tried to pair-up %s, but has odd number of items' % str(iterable))
yield (a,b)
演示:
简明方法:
序列在Python中有一个特定的含义——它可以被索引。从iter,你可以得到一个迭代器。此外,我不确定这是否会对性能产生影响,但您可能希望检查
try
/,但循环外部除外。性能也是使用itertools
实现这一点的优势——它是用C实现的。@agf:try…除了循环外的会导致错误行为。实际上,我更喜欢的方法是使用itertools
,但我觉得很冒险。不过,感谢您告诉我“序列”在python中有特定的含义。@agf:啊,对不起,您完全正确。我仍然在考虑我编写的代码草案,该草案手动执行迭代协议,否则将抛出一个StopIteration
异常,该异常将被吞没。啊,旧code.sequence的幽灵在Python中有一个特定的含义——它可以被索引。从iter
,你可以得到一个迭代器。此外,我不确定这是否会对性能产生影响,但您可能希望检查try
/,但循环外部除外。性能也是使用itertools
实现这一点的优势——它是用C实现的。@agf:try…除了循环外的会导致错误行为。实际上,我更喜欢的方法是使用itertools
,但我觉得很冒险。不过,感谢您告诉我“序列”在python中有特定的含义。@agf:啊,对不起,您完全正确。我仍然在考虑我编写的代码草案,该草案手动执行迭代协议,否则将抛出一个StopIteration
异常,该异常将被吞没。啊,旧代码的幽灵。