Как случайным образом выбрать пару соседних элементов из списка Python - PullRequest
0 голосов
/ 27 октября 2018

Каков наилучший способ случайного выбора двух соседних элементов из списка?

Как, например, для данного списка M=[2,0,8,6,4,0,1,2,4,6,5,6,5,89,12,23] Предположим, я хотел бы выбрать такие элементы, как (2,0),(6,5),(89,12),(5,89),(0,8) и т. Д. Воткод, который я пробовал:

import random
D=[]
M=[2,0,8,6,4,0,1,2,4,6,5,6,5,89,12,23]
  for r in range(10):
  D.append((random.sample(M,2)))

Но он не дает правильных пар

Ответы [ 4 ]

0 голосов
/ 27 октября 2018

Это, кажется, дает надлежащие результаты.Я отредактировал ответ выше, чтобы получить правильные результаты.

import random
D=[]
M=[2,0,8,6,4,0,1,2,4,6,5,6,5,89,12,23]
for r in range(10):
    try:

        idx = random.randint(0, len(M))
        D.append((M[idx], M[idx + 1]))
        print(D)
    except:
        print('Error')
0 голосов
/ 27 октября 2018

Используйте длину списка в качестве ограничения для случайного целого числа, затем используйте его в качестве индекса в списке, также выберите следующий элемент.

>>> a =[2,0,8,6,4,0,1,2,4,6,5,6,5,89,12,23]
>>> n_pairs = 6
>>> for _ in range(n_pairs):
...     i = random.randrange(len(a)-1)
...     print(a[i], a[i+1])

6 5
89 12
5 89
2 4
5 6
12 23

>>> 

Без повторов:

>>> a =[2,0,8,6,4,0,1,2,4,6,5,6,5,89,12,23]
>>> n_pairs = 6
>>> if n_pairs > len(a)//2:
    raise ValueError

>>> indices = random.sample(range(len(a)), n_pairs)
>>> result = [(a[i], a[i+1]) for i in indices]
>>> result
[(2, 0), (0, 8), (6, 5), (6, 5), (5, 89), (89, 12)]
0 голосов
/ 27 октября 2018

Если ваш М маленький и ваша соседняя пара должна быть строго в том же порядке, что и М, сначала сформируйте список пар значений, а затем выберите один из этого списка:

In [1]: M=[2,0,8,6,4,0,1,2,4,6,5,6,5,89,12,23]

In [2]: N = [(i, j) for i, j in zip(M[:-1], M[1:])]

In [3]: N
Out[3]:
[(2, 0),
 (0, 8),
 (8, 6),
 (6, 4),
 (4, 0),
 (0, 1),
 (1, 2),
 (2, 4),
 (4, 6),
 (6, 5),
 (5, 6),
 (6, 5),
 (5, 89),
 (89, 12),
 (12, 23)]

In [4]: import random

In [5]: random.choice(N)
Out[5]: (2, 4)

Если вы хотите списокв случайном порядке и хотите 6 пар:

In [3]: random.shuffle(N)

In [4]: N[:6]
Out[4]:
[(89, 12),
 (0, 8),
 (6, 4),
 (2, 4),
 (2, 0),
 (6, 5)]
0 голосов
/ 27 октября 2018

Итак, попробуйте это:

import random
D=[]
M=[2,0,8,6,4,0,1,2,4,6,5,6,5,89,12,23]
for r in range(10):
    idx = random.randint(0, len(M) - 2)
    D.append((M[idx], M[idx+1]))
...