【发布时间】:2017-12-20 03:52:44
【问题描述】:
我有一个这样的列表:['A,'B','C'] 我想要这样的输出
['AB','BC','CA']
我怎样才能得到这个输出。任何帮助表示赞赏。我从 for 循环中获取输入列表作为迭代。谢谢
【问题讨论】:
-
['A', 'B', 'C', 'D']想要什么输出?
标签: arrays python-3.x list numpy anaconda
我有一个这样的列表:['A,'B','C'] 我想要这样的输出
['AB','BC','CA']
我怎样才能得到这个输出。任何帮助表示赞赏。我从 for 循环中获取输入列表作为迭代。谢谢
【问题讨论】:
['A', 'B', 'C', 'D'] 想要什么输出?
标签: arrays python-3.x list numpy anaconda
将zip 与列表理解一起使用,注意lst[1:] + lst[:1] 用于将列表滚动一个元素:
lst = ['A','B','C']
[x + y for x, y in zip(lst, lst[1:] + lst[:1])]
# ['AB', 'BC', 'CA']
【讨论】:
如果您不关心配对之间和配对之间的顺序:
import itertools
list(map(''.join, itertools.combinations(['A', 'B', 'C', 'D'], 2)))
['AB', 'AC', 'AD', 'BC', 'BD', 'CD']
如果你在乎:
L = list('ABXD')
N = len(L)
[L[i] + L[(i+d) % N] for d in range(1, N//2 + 1) for i in range(N if 2*d < N else d)]
['AB', 'BX', 'XD', 'DA', 'AX', 'BD']
为了让这个逻辑更加透明,这里是[], ['A'], ['A', 'B'], ... ['A', 'B', 'C', 'D', 'E', 'F']的答案:
[]
[]
['AB']
['AB', 'BC', 'CA']
['AB', 'BC', 'CD', 'DA', 'AC', 'BD']
['AB', 'BC', 'CD', 'DE', 'EA', 'AC', 'BD', 'CE', 'DA', 'EB']
['AB', 'BC', 'CD', 'DE', 'EF', 'FA', 'AC', 'BD', 'CE', 'DF', 'EA', 'FB', 'AD', 'BE', 'CF']
【讨论】:
'ACD'吗?
使用出色的 more-itertools 包的完全惰性版本
import itertools
from more_itertools import pairwise
def wrapped_pairwise(it):
it = iter(it)
try:
element = next(it)
except StopIteration:
return iter(())
return (a+b for a, b in pairwise(itertools.chain((element,), it, (element,))))
assert list(wrapped_pairwise("")) == []
assert list(wrapped_pairwise("A")) == ["AA"]
assert list(wrapped_pairwise("ABC")) == ["AB","BC","CA"]
assert list(wrapped_pairwise(["A","B","C"])) == ["AB","BC","CA"]
【讨论】: