简体   繁体   中英

Convert list of tuples such that [(a,b,c)] converts to [(a,b),(a,c)]

Thoughts on how I would do this? I want the first value in the tuple to pair with each successive value. This way each resulting tuple would be a pair starting with the first value.

I need to do this: [(a,b,c)] --> [(a,b),(a,c)]

You can try this.

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

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

Using itertools.product

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

Using itertools.repeat

it=iter(('a','b','c'))
list(zip(itertools.repeat(next(it)),it))
# [('a', 'b'), ('a', 'c')]
a = [('a','b','c')]
a = a[0]
a = [tuple([a[0], a[index]]) for index in range(1, len(a))]

Try this !

A solution that uses itertools 's combinations module.

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

This would give a solution ('a', 'b') ('a', 'c')

You can just append pairs of tuples to a list:

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

Output:

[(1, 2), (1, 3)]

If your tuples are arbitrary length you can write a simple generator:

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

example result:

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

This is a memory-efficient solution.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM