[英]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.