генерировать список без повторяющихся кортежей и не иметь как (a, b), так и (b, a) кортежей, python - PullRequest
0 голосов
/ 31 марта 2020

Как я могу создать список кортежей, элементы которых не повторяются? Кроме того, если в списке есть (a, b) кортеж, в этом списке не будет сгенерировано (b, a).

Я использую приведенный ниже код из здесь , но это не не предоставить второе условие:

[tuple(i) for i in np.random.randint(5242, size=(500,2))]

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Я не уверен, что вам понадобится какой-нибудь однострочный, чтобы сделать это чисто. Я бы просто сделал что-то вроде:

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)
0 голосов
/ 31 марта 2020

Похоже, вы интересуетесь чем-то вроде набора наборов, а не просто кортежей. Если ваши объекты можно сортировать, вы можете использовать этот обычный хак:

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))

Если ваши объекты не сортируются, но могут быть сопоставимы, вы можете настроить вышеперечисленное для работы в любом случае:

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))

Обратите внимание, что вам нужно хранить отдельные included_list и included_set, только если вы хотите сохранить порядок в списке ввода. Если нет, и если вас не волнует порядок кортежей (a, b), просто наберите:

uniques = {tuple(sorted(tup)) for tup in input_list}
0 голосов
/ 31 марта 2020

вы можете просто использовать random.sample из встроенной библиотеки python:

nums = random.sample(range(5242), 1000)
res = [tuple(v) for v in zip(nums[::2], nums[1::2])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...