【问题标题】:find all possible combinations of list elements when moving ALL its elements everytime每次移动所有元素时找到列表元素的所有可能组合
【发布时间】:2021-06-05 08:56:00
【问题描述】:

我正在尝试获取包含 4 个元素的列表的可能组合,例如:('E', 'J', 'M', 'Z'),有效组合的条件是更改 每个组合中所有 4 个元素的位置

可能的组合有:

('J', 'E', 'Z', 'M')
('M', 'Z', 'E', 'J')
('Z', 'M', 'J', 'E').....

我尝试了 itertools.permutations (('E', 'J', 'M', 'Z'), 4),结果一点也不令人满意。有人可以帮忙吗?

【问题讨论】:

  • 不清楚你指的是哪种语言,为什么结果不理想。
  • itertools.permutations.combinations 有意以顺序/增量方式提供结果。如果您希望结果中的“连续”项目没有位于相同位置的元素,那么请明确这一点并显示您编写的代码以尝试获得您想要的结果。此外,使用较小的列表(例如“EJM”)并显示您认为有效的结果。
  • 也许你正在尝试"rotate" the list
  • 这是什么语言?你介意为语言使用标签吗? Python 显然
  • 所有 6 个都无效,因为 ('M', 'Z', 'E', 'J')('M', 'Z', 'J', 'E') 在同一位置有 M 和 Z。然后不能仅仅交换,因为那样会与('Z', 'M', 'E', 'J')('Z', 'M', 'J', 'E') 冲突。您的意思是替代品的“要么/或”,还是您想要问题中的 3 个,加上我提到的 2 个(5)以及原始的 1 个(总共 6 个)? 仍然将 2 个带有字母的选项放在同一位置。 那么再一次 排序的逻辑是什么?选择一个输入并写下所有预期结果 - 排列提供 24 种可能性。

标签: python list combinations permutation itertools


【解决方案1】:
import itertools


def get_permutations_whose_all_elems_are_in_a_different_place_than_the_original(original_elems):
    for permutation in itertools.permutations(original_elems):
        if any(left == right for left, right in zip(permutation, original_elems)):
            continue
        else:
            yield permutation

initial_list = ('E', 'J', 'M', 'Z')
print(str(initial_list) + "\n--------------------")
solutions = get_permutations_whose_all_elems_are_in_a_different_place_than_the_original(initial_list)
print("\n".join(str(solution) for solution in solutions))

输出:

('E', 'J', 'M', 'Z')
--------------------
('J', 'E', 'Z', 'M')
('J', 'M', 'Z', 'E')
('J', 'Z', 'E', 'M')
('M', 'E', 'Z', 'J')
('M', 'Z', 'E', 'J')
('M', 'Z', 'J', 'E')
('Z', 'E', 'J', 'M')
('Z', 'M', 'E', 'J')
('Z', 'M', 'J', 'E')

第一列没有E,第二列没有J,第三列没有M,第四列没有Z。

【讨论】:

  • 感谢一百万。正是我所照顾的
  • 你的问题不是很清楚,@aneroid为此问了很多问题,以后请提供预期的输出。
  • @Lenormju 是的,这是 OP 想要的众多可疑可能性之一。甚至可以选择仅通过顺序规则来执行此操作。顺便说一句,您可以通过翻转条件来修改if 子句,使其只有一个分支:if all(left != right ...): yield permutation,而不需要else 分支或continue
  • @aneroid 确实,你的解决方案似乎有效,但我按照我的想法写了它,我喜欢它明确:)
猜你喜欢
  • 1970-01-01
  • 2023-02-14
  • 2018-05-15
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多