Как распечатать элементы из списка, которые имеют разницу 2 - PullRequest
0 голосов
/ 03 февраля 2019

Допустим, у нас есть список только с целыми числами:

list = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]

Теперь я хочу вывести из этого списка все пары элементов, которые имеют разность 2. Поэтому я хочу, чтобы моя программа распечатываладальше:

12, 14

22, 24

29, 31

77, 79

Я много чего пробовал, но не могу найти решение.

Ответы [ 8 ]

0 голосов
/ 04 февраля 2019

@bobojmaj, вы также можете попробовать вот так.

>>> 
>>> l = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]
>>> output = [(l[i], l[j]) for i in range(len(l) - 1) for j in range(i + 1, len(l)) if abs(l[i] - l[j]) == 2]
>>> output
[(12, 14), (22, 24), (29, 31), (77, 79)]
>>> 
>>> s = '\n'.join([str(output[i][0]) + ', ' + str(output[i][1]) for i in range(len(output))])
>>> print(s)
12, 14
22, 24
29, 31
77, 79
>>> 

А если ваши элементы находятся в группе из 2, как в вашем примере, то следующее.

>>> 
>>> l = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]
>>> 
>>> n = len(l) - 1
>>> output = [(l[i], l[i + 1]) for i in range(0, n, 2) if abs(l[i] - l[i + 1]) == 2]
>>> output
[(12, 14), (22, 24), (29, 31), (77, 79)]
>>> 
0 голосов
/ 03 февраля 2019

Если ваш список отсортирован и не содержит повторяющихся элементов, разницу в 2 можно найти только в группах из трех последовательных элементов:

l = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]

l = sorted(set(l)) # if l is not sorted and has repeating elements

for a, b, c in zip(l, l[1:], l[2:]):
    if b - a == 2:
        print(a, b)
    elif c - a == 2:
        print(a, c)
# 12 14
# 22 24
# 29 31
# 77 79
0 голосов
/ 03 февраля 2019

Вы можете определить метод e, который возвращает последовательные пары, основываясь на условии:

def each_cons(predicate, iterable):
  i, size = 0, len(iterable)
  while i < size-2:
    if predicate(iterable[i], iterable[i+1]):
      yield iterable[i:i+2]
    i += 1

Затем просто вызовите его, установив условие:

array = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]

each_cons(lambda x, y: y - x == 2, array)
#=>  [[12, 14], [22, 24], [29, 31], [77, 79]]
0 голосов
/ 03 февраля 2019

Использование itertools.combinations:

from itertools import combinations as c
mlst = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]
print ([(i,j) for i,j in c(mlst,2) if abs(i-j) == 2])

# output: [(12, 14), (22, 24), (29, 31), (77, 79)]
0 голосов
/ 03 февраля 2019

Надеюсь, что приведенный ниже код отвечает вашим требованиям.

list1 = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]

for x in list1:
    if x+2 in list1:
        print(x,", ",x+2)
0 голосов
/ 03 февраля 2019

Простое понимание списка может решить эту проблему:

l = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]
l1 = [(x1,x2) for x1 in l for x2 in l if (x1-x2 == 2)]
print(l1)
# [(14, 12), (24, 22), (31, 29), (79, 77)]
0 голосов
/ 03 февраля 2019

Вместо того, чтобы пытаться выполнить итерацию по циклу, попробуйте использовать целое число , чтобы выполнить цикл вместо него, используя range(len(my_list)):

my_list = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]
for i in range(len(my_list) - 1):
    if my_list[i+1] - my_list[i] == 2:
        print("%d, %d" % (my_list[i], my_list[i+1]))

Вывод:

12, 14
22, 24
29, 31
77, 79
0 голосов
/ 03 февраля 2019

Вы можете использовать itertools.combinsk :

from itertools import combinations

lst = [1, 7, 12, 14, 22, 24, 29, 31, 39, 45, 77, 79, 85, 100]

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

for first, second in result:
    print(first, second)

Выход

12 14
22 24
29 31
77 79
...