【问题标题】:Python: how to get this elegantly? [duplicate]Python:如何优雅地做到这一点? [复制]
【发布时间】:2016-03-22 14:25:30
【问题描述】:

我是 Python 新手,我写了一个函数:

def f(x, y, z):
    ret = []
    for i in range(x):
        for j in range(y):
            for k in range(z):
                ret.append((i, j, k))
    return ret


print f(2, 3, 4)

输出:

[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3)]

但我对此并不满意,因为我认为必须有一个更短的实现。

那么任何人都可以给我一些提示吗?

【问题讨论】:

  • 好吧,如果您的代码有效并且您想改进它,Code Reviews SE 将是您提出问题的更好地方。在这里和那里查看什么是主题问题以获取更多详细信息。

标签: python python-2.7


【解决方案1】:

您可以使用itertools.product,因为这基本上就是您所追求的,Cartesian product

>>> from itertools import product
>>> list(product(range(2), range(3), range(4)))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3)]

所以替换你现有的功能你可以做

def f(x, y, z):
    return list(product(range(x), range(y), range(z)))

要删除您必须输入 range 的次数,您可以接受单个列表参数,然后使用生成器表达式,例如

def f(l):
    return list(product(*(range(i) for i in l)))

那么你可以称它为

>>> f([2,3,4])
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3)]

【讨论】:

  • 哇,没想到python里有这么酷的函数!
  • @CoryKarmer 最佳答案.. ..真棒
  • 我发现print list(product(range(2), range(2), range(2), range(2)))是正确的,但是我想消除重复的range(2),所以我来print list(product([range(2)] * 4))哪个输出是错误的。有什么办法可以消除这里重复的range(2)
  • itertools 是在 python 中发生很酷的事情的地方 :)
  • @Sayakiss 看我的编辑,你可以修改你的函数来接受一个列表参数,这对你来说更灵活吗?
【解决方案2】:

您可以使用list comprehension

 >>> [(i, j, k) for i in range(2) for j in range(3) for k in range(4)]
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3)]

你可以这样写函数:

def f(x, y, z):
    return [(i, j, k) for i in range(x) for j in range(y) for k in range(z)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2015-05-01
    相关资源
    最近更新 更多