我正在制作一个将可变数量的列表作为输入的函数(即任意参数列表)。我需要将每个列表中的每个元素与所有其他列表的每个元素进行比较,但我找不到任何方法来解决这个问题。
问问题
1039 次
4 回答
1
根据您的目标,您可以使用一些itertools
实用程序。例如,您可以使用itertools.product
on *args
:
from itertools import product
for comb in product(*args):
if len(set(comb)) < len(comb):
# there are equal values....
但是目前从您的问题中您想要实现的目标还不是很清楚。如果我没有正确理解您,您可以尝试以更具体的方式陈述问题。
于 2013-04-21T20:37:29.887 回答
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...
我不确定你需要对公共元素做什么,所以我会把它留在那里。
于 2013-04-22T00:54:45.853 回答
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)
于 2013-04-21T20:31:57.077 回答
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
于 2013-04-21T20:45:13.897 回答