基于函数输入的交错列表

时间:2017-04-01 17:05:01

标签: python list

我正在尝试创建一个交错列表列表的函数。主列表中的子列表数由用户输入定义。我能够使交错结果工作,但它不正确只是因为我硬编码变量来存储两个包含交错项的列表。我是一名使用Python的初学者,并且在编程方面没有太多经验。

下面的代码包含一个列表常量,其中包含一个名为inlist的元组列表。 inlist中的项目只会添加到子列表(mylist_amylist_b)中(如果可用),由10表示每个元组。

我评估每个元组并仅添加“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']]

3 个答案:

答案 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才能使此解决方案正常工作。