Вернуть все пары целых чисел из заданного списка целых чисел, которые имеют разницу 2 - PullRequest
1 голос
/ 06 апреля 2020

Как видно из названия, мне нужно найти разницу целых чисел в списке на 2 и вернуть список с кортежами.

initial_list = [1, 2, 3, 4]
expected_output = [(1, 3), (2, 4)]

Я написал этот код:

arr = [1, 2, 3, 4]
n = 2
arr1 = []
for i in range(len(arr)):
    x = i + n
    if x in arr:
        arr1.append(x)
print(arr1)

Но не работает ... Можете ли вы помочь мне? Thx

Ответы [ 4 ]

5 голосов
/ 06 апреля 2020

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

initial_list = [1, 2, 3, 4]
s = set(initial_list)

[(n, n+2) for n in initial_list if n + 2 in s ]
# [(1, 3), (2, 4)]
4 голосов
/ 06 апреля 2020

Вы можете сделать itertools.combinations и получить только комбинации, отличающиеся на 2:

[(x, y) for x, y in combinations(lst, 2) if abs(x-y) == 2]

Код :

from itertools import combinations

lst = [1, 2, 3, 4]

result = [(x, y) for x, y in combinations(lst, 2) if abs(x-y) == 2]
# [(1, 3), (2, 4)]

Почему вы получаете вывод?

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

1 голос
/ 06 апреля 2020

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

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def findIntsWithDif(data, dif):
    res = []
    for val1 in data:
        for val2 in data:
            if abs(val2 - val1) == dif and (val2, val1) not in res:
                res.append((val1, val2))

    return res

print(findIntsWithDif(arr, 2))

Это не самый эффективный способ сделать это, но он дает правильный результат. Он будет работать быстро для небольших массивов, хотя для больших массивов он будет довольно медленным, поскольку сложность O (n ^ 2).

1 голос
/ 06 апреля 2020

Ваша непосредственная проблема в том, что i - это просто индекс, а не один из элементов вашего списка. Либо

for i in arr:
    ...

или

for i in range(len(arr)):
    x = arr[i] + n
    ...

решит проблему.

Однако, вызов x in arr занимает O (n) времени, и вы на самом деле не нужно искать по всему списку, особенно если вы сначала отсортировали его. Вам нужно только пройтись по списку, пока не найдете значение, превышающее вашу цель, например что-то вроде

for i, x in enumerate(sorted(arr)):
    for y in arr[i:]:
        d = y - x
        if d == 2:
            arr1.append((x,y))
        elif d > 2:
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...