Jak mogę wygenerować listę krotek, których elementy nie są powtarzane? Ponadto, jeśli na liście znajduje się (a, b) krotka, (b, a) nie zostanie wygenerowany na tej liście.

Używam kodu poniżej z tutaj, ale nie zapewnia drugiego warunku:

[tuple(i) for i in np.random.randint(5242, size=(500,2))]
-1
Atefeh Rashidi 31 marzec 2020, 19:27

3 odpowiedzi

Najlepsza odpowiedź

Nie jestem pewien, czy dostaniesz jakąkolwiek jedną linijkę, aby zrobić to czysto. Po prostu zrobiłbym coś takiego:

num_set = set()
while len(num_set) < 500:
    a, b = random.randint(0, 5242), random.randint(0, 5242)
    if (b, a) not in num_set:
        num_set.add((a, b))
num_list = list(num_set)
1
acushner 31 marzec 2020, 16:39

Możesz po prostu użyć random.sample z wbudowanej biblioteki Pythona:

nums = random.sample(range(5242), 1000)
res = [tuple(v) for v in zip(nums[::2], nums[1::2])]
-2
acushner 31 marzec 2020, 16:37

Wygląda na to, że interesuje Cię coś bardziej jak zestaw zestawów niż same krotki. Jeśli twoje obiekty można sortować, możesz użyć tego typowego hackowania:

included_set = set()
included_list = list()
input_list = np.random.randint(5242, size=(500,2))

for (a, b) in input_list:
    sorted_version = tuple(sorted((a, b)))
    if sorted_version not in included_set:
        included_set.add((a, b))
        included_list.append((a, b))

Jeśli twoich obiektów nie można sortować, ale można je haszować i porównywać, możesz dostosować powyższe ustawienia, aby mimo to działały:

for (a, b) in input_list:
    if (a, b) not in included_set and (b, a) not in included_set:
        included_set.add((a, b))
        included_list.append((a, b))

Pamiętaj, że musisz zachować oddzielne included_list i included_set, jeśli chcesz zachować kolejność na liście wejściowej. Jeśli nie i jeśli nie obchodzi Cię kolejność krotek (a, b), użyj po prostu:

uniques = {tuple(sorted(tup)) for tup in input_list}
1
scnerd 31 marzec 2020, 16:43