Python: Проблемы с использованием функции цикла из Sympy в списке - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь использовать функцию цикла из Sympy, чтобы упростить список таким образом.

from sympy.combinatorics import Permutation, Cycle

Cycle(1,2,3)(3,4,5)(7)

И вывод должен быть ...

Cycle (1, 2, 4, 5, 3) (7)

Однако, когда я пытаюсь использовать ...

a_list = [[1,2,3,4],[4,5,7],[3,4,2]]
b = Cycle(a_list)
print(b)

Я получаю эту ошибку

Объект 'tuple' не вызывается

Я знаю, что ввожу неправильный тип переменной в цикл, но может кто-нибудь сказать мне, что я могу делать с Cycle. Это функция, которая делает именно то, что мне нужно, мне просто нужно найти способ преобразовать список в удобный для цикла тип. Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Думаю, вы ищете что-то вроде этого:

a_list = [[1,2,3,4],[4,5,7],[3,4,2]]

b = Cycle()
for i in a_list:
    b = b(*tuple(i))
print(b)

Чтобы преобразовать в список, попробуйте b.list().

Пояснение

tuple(i) преобразует [1,2,3,4] в (1,2,3,4)

Допустим, у вас есть функция foo. Бег foo(1,2,3,4) такой же, как бег foo(*(1,2,3,4))

Более простой пример:

a_list = [[1,2], [3,4]]

b = Cycle()

На первой итерации (i = [1,2]) вызов b(*tuple(i)) совпадает с вызовом b(1,2), что, поскольку b = Cycle(), на самом деле Cycle()(1,2) который совпадает с Cycle(1,2) согласно документам .

На второй итерации (i = [3,4]) вызов b(*tuple(i)) действительно b(3,4), что составляет Cycle(1,2)(3,4)

Надеюсь, этот пример имеет смысл. Это немного сбивает с толку, потому что здесь так много скобок. Если вы все еще в затруднении, вы можете выполнить код пошагово (возможно, с помощью отладчика), чтобы понять, что происходит.

0 голосов
/ 06 мая 2020

Cycle (как описано в строке документации) дает некоторые тонкие преимущества для ввода, но если все элементы присутствуют в списке циклов, который вы показали, то достаточно просто передать их в Permutation.

Помните, что порядок имеет значение:

>>> Cycle(1,3)(3,2)
Cycle(1, 2, 3)
>>> Cycle(2,3)(1,3)
Cycle(1, 3, 2)

>>> p = Permutation([[1,3],[3,2]])
>>> Cycle(p)
Cycle(1, 2, 3)
>>> p.list() == _.list() == [0, 2, 3, 1]

Обратите внимание, что перестановка позволит вам явно запрашивать array_form или cyclic_form, тогда как Cycle разрешает только метод list():

>>> p.array_form
[0, 2, 3, 1]
>>> p.cyclic_form
[[1, 2, 3]]
...