繁体   English   中英

如何在Python中将元组的元素分成成对出现?

[英]How to separate elements of tuples into occurrences of pairs in Python?

我有一个元组,看起来像:
t=(('a','b'),('a','c','d','e'),('c','d','e'))

我需要重新排列它,以便有一个新的元组,如下所示:
t2=(('a','b'),('a','c'),('c','d'),('d','e'),('c','d'),('d','e'))

基本上,新的元组从旧的元组的每个元素中取出(2对)对。 但是我不确定如何开始。 谢谢你的帮助。

使用带有zip的生成器表达式进行配对,最后将其转换为tuple

>>> t = (('a','b'),('a','c','d','e'),('c','d','e'))
>>> tuple((x) for tupl in t for x in zip(tupl, tupl[1:]))
(('a', 'b'), ('a', 'c'), ('c', 'd'), ('d', 'e'), ('c', 'd'), ('d', 'e'))                                               

试试看:

 tuple([(t[i][j],t[i][j+1]) for i in range(len(t)) for j in range(len(t[i])-1)])
#[('a', 'b'), ('a', 'c'), ('c', 'd'), ('d', 'e'), ('c', 'd'), ('d', 'e')]

您也可以尝试其他方法。 如果问题减少了,则仅对一个元组执行此操作:

def pairs(my_tuple):
    return [(my_tuple[i],my_tuple[i+1]) for i in range(len(my_tuple)-1)]

然后可以为所有元组映射

tuple(sum(list(map(pairs,t)),[]))
#(('a', 'b'), ('a', 'c'), ('c', 'd'), ('d', 'e'), ('c', 'd'), ('d', 'e'))

说明:

map(pairs,t)       : maps the function pairs for every element in tuple t
list(map(pairs,t)) : output of the above
                      But as a nested list 
                      [[[('a', 'b')], [('a', 'c'), ('c', 'd'), ('d', 'e')],...]
sum(list(...),[])   : Flattens out this nested list for the desired output

您可以使用以下易于理解的代码:

t = (('a','b'),('a','c','d','e'),('c','d','e'))
t2 = []
for i in t:
    for j in range(len(i)-1):
           t2.append((i[j], i[j+1]))
t2 = tuple(t2)

显然,它并没有像其他答案那样非常优化,但是为了容易理解,它将是完美的。

那等于:

t2 = tuple((i[j], i[j+1]) for i in t for j in range(len(i)-1))

那是一个生成器表达式,与列表理解非常相似(它使用方括号而不是方括号),并且它们基本上执行类似的操作,或者至少在诸如此类的基本代码中。 我仍然不太了解它们之间的区别,但是生成器的速度快一倍,而列表理解的速度较慢,但​​可重用...

没关系:生成器意味着:

t2 = tuple(...) # Make with the result array a tuple, otherwise it will be a list.
for i in t # Iterate over each item of t, they will by called i.
for i in t for j in range(len(i)) # Iterate over each item of t --called--> i and then iterate over the range(len(i)) --called--> j. 
(i[j], i[j+1]) for i in t for j in range(len(i)) # The same as before but each time we get a new j (each time the second loop iterate) do --> (i[j], i[j+1])

我知道,使同一行上的两个生成器/列表表达式/理解很奇怪。 我总是看着这样的答案,以记住该怎么做。

我的旧答案是:

t = (('a','b'),('a','c','d','e'),('c','d','e'))
t2 = []
for i in t:
    for j in range(len(i)):
        if j < len(i) - 1:
           t2.append((i[j], i[j+1]))
t2 = tuple(t2)

但是我注意到,在循环的len()中添加-1可以避免该行,因为我永远不会遇到索引错误。

这是我很快想到的

def transform(t):
    out = []
    for tup in t:
        for i in range(0, len(tup) - 1):
            out.append((tup[i], tup[i+1]))
    return tuple(out)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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