我正在尝试创建一个交错列表列表的函数。主列表中的子列表数由用户输入定义。我能够使交错结果工作,但它不正确只是因为我硬编码变量来存储两个包含交错项的列表。我是一名使用Python的初学者,并且在编程方面没有太多经验。
下面的代码包含一个列表常量,其中包含一个名为inlist
的元组列表。 inlist
中的项目只会添加到子列表(mylist_a
或mylist_b
)中(如果可用),由1
或0
表示每个元组。
我评估每个元组并仅添加“inlist”中包含1的项目。
我的代码:
inlist = [('apples', 1), ('oranges', 0), ('bananas', 0), ('grapes', 1),
('strawberries', 1), ('pears', 1), ('cucumbers', 0), ('lettuce', 0),
('tomatos', 0), ('onions', 0), ('garlic', 1), ('pineapples', 1)]
mainlist = []
mylist_a = []
mylist_b = []
counter = 1
for i in inlist:
if i[1] == 1:
counter += 1
if i[1] == 1 and counter % 2 == 0:
mylist_a += i[0]
elif i[1] == 1 and counter % 2 == 1:
mylist_b += i[0]
mainlist = [mylist_a] + [mylist_b]
print 'list a: ' + str(mylist_a), 'list b: ' + str(mylist_b), 'counter % 2: '+str(counter % 2)
print mainlist
主要清单的输出:
>>>[['apples', 'strawberries', 'garlic'], ['grapes', 'pears', 'pineapples']]
此方法不正确,因为我希望用户使用函数定义列表数,并希望“inlist”列表中的项目分布在定义的所有列表中。
如果用户想要3个列表,结果将更改为:
>>>[['apples', 'pears'], ['grapes', 'garlic'], ['strawberries', 'pineapples']]
答案 0 :(得分:1)
类似于:
def distribute_sublists(inlist,n=2):
sub = [x for x,avail in inlist if avail]
return [sub[i::n] for i in range(n)]
其中inlist
是元组列表,n
是您想要除以它们的“组”数。在第一步中,我们构建了所有可用元素的子结果sub
。在第二步中,我们使用列表理解和切片运算符 i::n
来构建从i
开始的子列表并使 hops of n
。
这给出了:
>>> distribute_sublists(inlist,n=1)
[['apples', 'grapes', 'strawberries', 'pears', 'garlic', 'pineapples']]
>>> distribute_sublists(inlist,n=2)
[['apples', 'strawberries', 'garlic'], ['grapes', 'pears', 'pineapples']]
>>> distribute_sublists(inlist,n=3)
[['apples', 'pears'], ['grapes', 'garlic'], ['strawberries', 'pineapples']]
>>> distribute_sublists(inlist,n=4)
[['apples', 'garlic'], ['grapes', 'pineapples'], ['strawberries'], ['pears']]
>>> distribute_sublists(inlist,n=5)
[['apples', 'pineapples'], ['grapes'], ['strawberries'], ['pears'], ['garlic']]
因此,它将第一个项目分配到第一个列表,第二个项目分配到第二个项目,直到所有 n 列表都有一个元素,下一个元素将再次分配给第一个列表,依此类推以 Round Robin 的方式。
算法在 O(n)中运行,其中 n inlist
中的元素数量(不要与n
中的{{1}}混淆功能)。
答案 1 :(得分:1)
这会对列表进行过滤,然后对其进行解交织。
inlist = [('apples', 1), ('oranges', 0), ('bananas', 0), ('grapes', 1),
('strawberries', 1), ('pears', 1), ('cucumbers', 0), ('lettuce', 0),
('tomatos', 0), ('onions', 0), ('garlic', 1), ('pineapples', 1)]
from itertools import cycle, izip
def deinterweave(L, n):
r = [list() for _ in range(n)]
for item, o in izip(L, cycle(r)):
o.append(item)
return r
filtered = [item for item, flag in inlist if flag == 1]
print deinterweave(filtered, 2)
print deinterweave(filtered, 3)
显示:
>>> print deinterweave(filtered, 2)
[['apples', 'strawberries', 'garlic'], ['grapes', 'pears', 'pineapples']]
>>> print deinterweave(filtered, 3)
[['apples', 'pears'], ['grapes', 'garlic'], ['strawberries', 'pineapples']]
答案 2 :(得分:0)
您可以先创建main_list
而不是sublists
,然后根据用户输入将它们分成sublists
个数字,如下所示:
import more_itertools
inlist = [('apples', 1), ('oranges', 0), ('bananas', 0), ('grapes', 1),
('strawberries', 1), ('pears', 1), ('cucumbers', 0), ('lettuce', 0),
('tomatos', 0), ('onions', 0), ('garlic', 1), ('pineapples', 1)]
main_list = [txt[0] for txt in inlist if txt[1]]
list_count = 3
sub_lists = [list(elem) for elem in list(more_itertools.distribute(list_count, main_list))]
print sub_lists
这将导致:
[['apples', 'pears'], ['grapes', 'garlic'], ['strawberries', 'pineapples']]
您需要导入模块more-itertools
才能使此解决方案正常工作。