将列表转换为包含"无"的元组列表



我想转换这样的列表:L=[ad','bc','gh','kj','ws','er','th']

使用python 3 转换为[('ad','bc','gh','kj','ws'(,(er','th',None,None(]

元组将包含相同数量的元素,即使列表没有提供足够的元素。所以如果我有6个元素,我会得到两个元组,一个是5个元素,另一个只有一个元素和4个非。但如果我只有5个元素,我应该得到一个包含5个元素的元组列表。

我试过zip,但它没有给我想要的结果

您可以使用more_itertools包中的grouper进行以下操作:

from more_itertools import grouper
l = ['ad', 'bc', 'gh', 'kj', 'ws', 'er', 'th']
result = list(grouper(l, 5, incomplete="fill", fillvalue=None))
print(result)

给出

[('ad', 'bc', 'gh', 'kj', 'ws'), ('er', 'th', None, None, None)]

或者,正如Tomerikoo所指出的,您可以使用标准库中的itertools来构造grouper函数:

from itertools import zip_longest
def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
"Collect data into non-overlapping fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
# grouper('ABCDEFG', 3, incomplete='strict') --> ABC DEF ValueError
# grouper('ABCDEFG', 3, incomplete='ignore') --> ABC DEF
args = [iter(iterable)] * n
if incomplete == 'fill':
return zip_longest(*args, fillvalue=fillvalue)
if incomplete == 'strict':
return zip(*args, strict=True)
if incomplete == 'ignore':
return zip(*args)
else:
raise ValueError('Expected fill, strict, or ignore')
L = ['ad', 'bc', 'gh', 'kj', 'ws', 'er', 'th']
L3 = list()
idx = 0
while idx < len(L):
L2 = list()
for idx2 in range(5):
L2.append(L[idx])
idx = idx +1
if idx >= len(L):
break
while idx2 < 4:
L2.append(None)
idx2 = idx2 + 1
L3.append(tuple(L2))
print(L3)

Python代码:

def getTuples(size):
intSize = size // 5
if size / 5 > intSize:
return (intSize + 1) * 5
else:
return intSize * 5
def convert(l):
new = []
t = ()
tValue = 0
for i in range(0, getTuples(len(l))):
tValue += 1
try:
val = l[i]
except IndexError:
val = None
if tValue == 5:
new.append(t)
t = ()
else:
t = t + (val,)
new.append(t)

最新更新