我需要帮助在python中提出一个函数,该函数可以将3个参数作为列表并给我所有元素的组合[重复]

Posted

技术标签:

【中文标题】我需要帮助在python中提出一个函数,该函数可以将3个参数作为列表并给我所有元素的组合[重复]【英文标题】:I need help coming up with a function in python that can take 3 arguements as lists and give me all combinations of there elements [duplicate] 【发布时间】:2013-08-09 18:35:07 【问题描述】:

到目前为止,我几乎什么都没做

def dress_me(shirt, tie, suit):


 #    if type(shirt) != list or type(tie) != list or type(suit) != list:
    #        return None
            combinations = dress_me(shirt, tie, suit)
            for combo in combinations:
                print(combo)

【问题讨论】:

【参考方案1】:

使用itertools.product:

def dress_me(shirt, tie, suit):
    if type(shirt) != list or type(tie) != list or type(suit) != list:
        return None
    return list(itertools.product(shirt, tie, suit))

演示:

>>> dress_me([1,2,3],[4,5,6],[7,8,9])
[(1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 7), (1, 6, 8), (1, 6, 9), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 7), (2, 6, 8), (2, 6, 9), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 6, 7), (3, 6, 8), (3, 6, 9)]

【讨论】:

我认为如果没有列表测试会更 Pythonic。任何可迭代的实际上都可以工作。如果其中一个输入无效,我不确定返回 None 是否有意义;这似乎违反直觉。如果我将它传递给不可迭代的,我会期待一个例外;这将使跟踪我的问题更容易。如果确实需要返回 None,请参阅 this answer 以检查可迭代类型。 是的。你说的有道理。但首先我只是回答 OP 似乎想要的问题。然后测试 if is Iterable 是不行的。如果传递一个字符串怎么办?我会导致错误。尝试...除了是一个不错的选择。我也喜欢。 字符串是可迭代的;你会得到所有字符的产品,这可能正是调用者想要的。 (我检查了,我链接的答案适用于字符串,至少在 2.7 中。)我假设调用函数的程序员知道字符串是可迭代的,如果这不是他们想要的输出,他们会看到很快。 如果一个字符串被传递,你得到的显然不是 OP 想要的。【参考方案2】:

或者,为了完整起见,在没有额外功能的生成器样式中:

import itertools

for combination in itertools.product(shirts, ties, suits):
    whatever_you_want_to_do(combination)

【讨论】:

【参考方案3】:
def dress_me(shirt, tie, suit):
    all_combinations = []
    for s in shirt:
        for t in tie:
            for su in suit:
                all_combinations.append((s,t,su))
    return all_combination

也许有一种更 Pythonic 的方式来做到这一点:)

【讨论】:

【参考方案4】:

由于您似乎在尝试提出递归解决方案,因此这是它的一般形式:

def all_perms(thing):
    if len(thing) <=1:
        yield thing
    else:
        for perm in all_perms(thing[1:]):
            for i in range(len(perm)+1):
                yield perm[:i] + thing[0:1] + perm[i:]

这适用于大多数类型的迭代。演示:

In [5]: list(all_perms(('shirt','tie','suit')))
Out[5]: 
[('shirt', 'tie', 'suit'),
 ('tie', 'shirt', 'suit'),
 ('tie', 'suit', 'shirt'),
 ('shirt', 'suit', 'tie'),
 ('suit', 'shirt', 'tie'),
 ('suit', 'tie', 'shirt')]

递归一开始很难理解,但一般形式是:

if simplest_case:
    return simplest_case
else:
    #recurse

在这种情况下,returnyield 替换,以便生成一个对内存更友好的生成器。您仍然不应该期望这是性能最佳的解决方案,但我将其包括在内是为了完整起见,因为除了 itertools 很酷之外,“使用 ITERTOOLS”最终不会教给您很多东西。

【讨论】:

以上是关于我需要帮助在python中提出一个函数,该函数可以将3个参数作为列表并给我所有元素的组合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python怎么查看帮助信息

rstudio如何加载函数?

在Python中定义Main函数

python入门(13)获取函数帮助和调用函数

使用参数在python脚本之间传递函数

Python 装饰器