【问题标题】:Python combinations no repeat by constraintPython 组合不受约束重复
【发布时间】:2023-04-01 14:12:01
【问题描述】:

我有一个元组(Name, val 1, val 2, Class)

tuple = (("Jackson",10,12,"A"),
         ("Ryan",10,20,"A"),
         ("Michael",10,12,"B"),
         ("Andrew",10,20,"B"),
         ("McKensie",10,12,"C"),
         ("Alex",10,20,"D"))

我需要使用itertools combinations 返回所有不重复课程的组合。如何返回不重复课程的组合。例如,第一个返回的语句是:tuple0, tuple2, tuple4, tuple5 等等。

【问题讨论】:

  • 长度为 4 的所有组合?或者任何长度?
  • 任意长度的组合,只是没有重复的类。
  • 附注调用你的元组tuple 并不聪明

标签: python tuples combinations


【解决方案1】:

分组(按班级):

>>> ts = (("Jackson",10,12,"A"),
...       ("Ryan",10,20,"A"),
...       ("Michael",10,12,"B"),
...       ("Andrew",10,20,"B"),
...       ("McKensie",10,12,"C"),
...       ("Alex",10,20,"D"))
>>> import itertools
>>> import operator
>>>
>>> by_class = operator.itemgetter(3)
>>>
>>> tuple_grps = [list(grp) for key, grp in itertools.groupby(sorted(ts, key=by_class), key=by_class)]
>>> tuple_grps
[[('Jackson', 10, 12, 'A'), ('Ryan', 10, 20, 'A')],
 [('Michael', 10, 12, 'B'), ('Andrew', 10, 20, 'B')],
 [('McKensie', 10, 12, 'C')],
 [('Alex', 10, 20, 'D')]]

然后,使用itertools.product 得到想要的结果:

>>> for xs in itertools.product(*tuple_grps):
...     print(xs)
...
(('Jackson', 10, 12, 'A'), ('Michael', 10, 12, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D'))
(('Jackson', 10, 12, 'A'), ('Andrew', 10, 20, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D'))
(('Ryan', 10, 20, 'A'), ('Michael', 10, 12, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D'))
(('Ryan', 10, 20, 'A'), ('Andrew', 10, 20, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D'))

要获得任意长度的组合:

>>> for i in range(1, len(tuple_grps)+1):
...     for xs in itertools.combinations(tuple_grps, i):
...         for ys in itertools.product(*xs):
...             print(ys)
...
(('Jackson', 10, 12, 'A'),)
(('Ryan', 10, 20, 'A'),)
(('Michael', 10, 12, 'B'),)
(('Andrew', 10, 20, 'B'),)
(('McKensie', 10, 12, 'C'),)
(('Alex', 10, 20, 'D'),)
(('Jackson', 10, 12, 'A'), ('Michael', 10, 12, 'B'))
(('Jackson', 10, 12, 'A'), ('Andrew', 10, 20, 'B'))
(('Ryan', 10, 20, 'A'), ('Michael', 10, 12, 'B'))
(('Ryan', 10, 20, 'A'), ('Andrew', 10, 20, 'B'))
...
(('Ryan', 10, 20, 'A'), ('Andrew', 10, 20, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D'))

【讨论】:

  • 有没有办法只打印特定数量的元组,而不是直到最大值?
  • 没关系for i in range(numberYouWant, len(tuple_grps)+1):
  • @user2758113,啊...我误解了你的评论。
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2015-10-23
  • 2022-10-23
  • 2018-11-12
相关资源
最近更新 更多