Преобразовать список кортежей таким образом, чтобы [(a, b, c)] преобразовывалось в [(a, b), (a, c)] - PullRequest
3 голосов
/ 27 марта 2020

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

Мне нужно сделать это: [(a, b, c)] -> [(a, b), (a c)]

Ответы [ 5 ]

4 голосов
/ 27 марта 2020

Вы можете попробовать это.

(t,)=[('a','b','c')]

[(t[0],i) for i in t[1:]]
# [('a', 'b'), ('a', 'c')]

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

it=iter(('a','b','c'))
list(itertools.product(next(it),it))
# [('a', 'b'), ('a', 'c')]

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

it=iter(('a','b','c'))
list(zip(itertools.repeat(next(it)),it))
# [('a', 'b'), ('a', 'c')]
0 голосов
/ 27 марта 2020

Если ваши кортежи произвольной длины, вы можете написать простой генератор:

def make_pairs(iterable):
    iterator = iter(iterable)
    first = next(iterator)
    for item in iterator:
        yield first, item

пример результата:

my_tuple = ('a', 'b', 'c', 'd')
list(make_pairs(my_tuple))
Out[170]: [('a', 'b'), ('a', 'c'), ('a', 'd')]

Это решение с эффективным использованием памяти.

0 голосов
/ 27 марта 2020

Вы можете просто добавить пары кортежей в список:

original = [(1,2,3)]

def makePairs(lis):
    ret = []
    for t in lis:
        ret.append((t[0],t[1]))
        ret.append((t[0],t[2]))
    return ret


print(makePairs(original))

Вывод:

[(1, 2), (1, 3)]
0 голосов
/ 27 марта 2020

Решение, использующее модуль комбинаций itertools.

from itertools import combinations  
arr = (['a','b','c'])
for i in list(combinations(arr, 2)):
    if(i[0]==arr[0]):
        print(i ,end = " ")

Это даст решение ('a', 'b') ('a', 'c')

0 голосов
/ 27 марта 2020
a = [('a','b','c')]
a = a[0]
a = [tuple([a[0], a[index]]) for index in range(1, len(a))]

Попробуйте это!

...