Python 从多个列表生成元素的组合
我正在制作一个函数,它将可变数量的列表作为输入(即,一个。Python 从多个列表生成元素的组合,python,arrays,for-loop,args,Python,Arrays,For Loop,Args,我正在制作一个函数,它将可变数量的列表作为输入(即,一个。 我需要将每个列表中的每个元素与所有其他列表中的每个元素进行比较,但我找不到任何方法来实现这一点。如果希望将参数作为字典 def kw(**kwargs): for key, value in kwargs.items(): print key, value 如果希望所有参数都列为列表: def arg(*args): for item in args: print it
我需要将每个列表中的每个元素与所有其他列表中的每个元素进行比较,但我找不到任何方法来实现这一点。如果希望将参数作为字典
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)
根据您的目标,您可以使用一些
itertools
实用程序。例如,您可以在*args
上使用:
from itertools import product
for comb in product(*args):
if len(set(comb)) < len(comb):
# there are equal values....
来自itertools导入产品的
对于梳入式产品(*args):
如果len(设置(梳))
但目前,从你的问题来看,还不太清楚你想要实现什么。如果我没有正确理解您的意思,您可以尝试以更具体的方式陈述问题。该模块为此类任务提供了许多有用的工具。通过将下面的示例集成到特定的比较逻辑中,可以使其适应您的任务
请注意,以下假设为交换函数。也就是说,由于对称的原因,大约有一半的元组被省略了
例如:
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
我认为@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...
我不确定您需要对公共元素做什么,所以我将把它放在那里