Создайте мультимножество из набора X
В мультисети допускается наличие нескольких элементов
Например. если X (нормальный набор) = {0,2,4,7,10}, то ∆X (мультисеть) = {2,2,3,3,4,5,6,7,8,10}.
∆X обозначает мультимножество всех (N 2) парных расстояний между точками в X
Как я могу написать это на Python?
Я создал Список X, но я не знаю, как поместить все различия в другой список и упорядочить их.
Я надеюсь, что вы можете мне помочь.
3 ответа
Это в основном только одна строка.
import itertools
s = {0,2,4,7,10}
sorted([abs(a-b) for (a,b) in itertools.combinations(s,2)])
Ты можешь использовать itertools
import itertools
s = {0,2,4,7,10}
k = itertools.combinations(s,2)
distance = []
l = list(k)
for p in l:
distance.append(abs(p[1]-p[0]))
print(sorted(distance))
Простой способ - преобразовать ваш набор в список, отсортировать его, а затем использовать двойной цикл for для вычисления различий:
X = {0,2,4,7,10} # original set
sorted_X = sorted(list(X))
diffs = []
for i, a in enumerate(sorted_X):
for j, b in enumerate(sorted_X):
if j > i:
diffs.append(b-a)
print(diffs)
#[2, 4, 7, 10, 2, 5, 8, 3, 6, 3]
И если вы хотите, чтобы различия также сортировались:
print(sorted(diffs))
#[2, 2, 3, 3, 4, 5, 6, 7, 8, 10]
Другой вариант, который будет работать в этом случае, это использовать itertools.product
:
from itertools import product
print(sorted([(y-x) for x,y in product(sorted_X, sorted_X) if y>x]))
#[2, 2, 3, 3, 4, 5, 6, 7, 8, 10]