生成多个列表中元素的组合

时间:2013-04-21 20:25:07

标签: python arrays for-loop args

我正在创建一个函数,它将可变数量的列表作为输入(即arbitrary argument list)。 我需要将每个列表中的每个元素与所有其他列表中的每个元素进行比较,但我找不到任何方法来解决这个问题。

4 个答案:

答案 0 :(得分:1)

根据您的目标,您可以使用一些itertools实用程序。例如,您可以在*args上使用itertools.product

from itertools import product
for comb in product(*args):
    if len(set(comb)) < len(comb):
        # there are equal values....

但是目前你的问题并不是很清楚你想要实现什么。如果我没有正确理解你,你可以尝试以更具体的方式陈述问题。

答案 1 :(得分:1)

我认为@LevLeitsky的答案是对可变数量的列表中的项进行循环的最佳方法。但是,如果循环只是为了找到列表中的项目对之间的公共元素,我会做的有点不同。

这是一种在每对列表之间找到共同元素的方法:

import itertools

def func(*args):
    sets = [set(l) for l in args]
    for a, b in itertools.combinations(sets, 2):
        common = a & b # set intersection
        # do stuff with the set of common elements...

我不确定你需要对共同的元素做什么,所以我会留在那里。

答案 2 :(得分:0)

如果你想把参数作为字典

def kw(**kwargs):
    for key, value in kwargs.items():
        print key, value

如果你想把所有参数都列为列表:

 def arg(*args):
        for item in args:
            print item

你可以同时使用

def using_both(*args, **kwargs) :
     kw(kwargs)
     arg(args)

这样称呼:

using_both([1,2,3,4,5],a=32,b=55)

答案 3 :(得分:0)

itertools模块为这些任务提供了许多有用的工具。您可以通过将以下示例集成到您的特定比较逻辑中来使其适应您的任务。

请注意,以下内容假定具有可交换功能。也就是说,出于对称的原因,大约有一半的元组被省略。

示例:

import itertools

def generate_pairs(*args):
    # assuming function is commutative
    for i, l in enumerate(args, 1):
        for x, y in itertools.product(l, itertools.chain(*args[i:])):
            yield (x, y)

# you can use lists instead of strings as well
for x, y in generate_pairs("ab", "cd", "ef"):
    print (x, y)

# e.g., apply your comparison logic
print any(x == y for x, y in generate_pairs("ab", "cd", "ef"))
print all(x != y for x, y in generate_pairs("ab", "cd", "ef"))

输出:

$ python test.py
('a', 'c')
('a', 'd')
('a', 'e')
('a', 'f')
('b', 'c')
('b', 'd')
('b', 'e')
('b', 'f')
('c', 'e')
('c', 'f')
('d', 'e')
('d', 'f')
False
True