构建一个变量,该变量在一个巨大的lis中组合了多个枚举

2024-10-06 10:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用最简单的方法来创建一个庞大的列表。你知道吗

假设我有三个六面骰子,所以它们的值都是randint(1,6)。 我想要一组包含所有可能的方法来组合这3个数字的值,所以它可以是die1*die2+die3,也可以是die1**die3-die2,等等

我想定义一个变量Z,它等于加法,减法,乘法,等等。这样,我可以说die1 Z die2 Z die3,它会给我一个巨大的列表,而不用我把它打出来。这在Python中是可能的吗?任何想法都将不胜感激。你知道吗


Tags: 方法列表定义数字骰子randint乘法die2
2条回答

这里要知道的关键是,可以将函数作为参数传递给另一个函数(或在列表中)。一旦你明白这个问题变得更容易解决。你知道吗

如果您想要列表:

from operator import add,sub,mul,div
funcs = [add,sub,mul,div]
die = [1,2,3,4,5,6]

results = [f(x,y) if y != 0 else None for x in die for y in [g(z,w) for z in die for w in die for g in funcs] for f in funcs]

请注意,如果包含“无”,则通常会发生被零除的情况。你知道吗

不过,如果你把它分解成一个函数,会更清楚。它接受两个数字列表和一个操作列表,并返回所有结果:

def results(funcs, xs, ys):
  out = []
  for f in funcs:
    for x in xs:
      for y in ys:
        try:
          out.append(f(x,y))
        except ZeroDivisionError:
          pass
  return out

在被零除的情况下,这没有任何意义。使用likeresults(funcs,die,results(funcs,die,die))获得所有结果。你知道吗

这两种方法的结果都有很多重复之处,因此根据您实际想要做的事情,您可能希望使用set而不是list。你知道吗

另外,考虑一下,但是根据您计划做什么,您可以让results返回一个生成器:

def results(funcs, xs, ys):
  for f in funcs:
    for x in xs:
      for y in ys:
        try:
          yield f(x,y)
        except ZeroDivisionError:
          pass

如果您正在处理非常大的结果集,但只想逐个查看它们,这是一个比构建整个列表更好的选择。你知道吗

我想你想问的是如何最好地重载python中笛卡尔积的操作符。你知道吗

尝试从itertools使用product

from itertools import *
die_outcomes = [1,2,3,4,5,6]
list(product(product(die_outcomes, die_outcomes), die_outcomes))

相关问题 更多 >