根据字符串创建特定列表

时间:2018-12-23 10:25:20

标签: python string loops

根据评论进行了编辑:

我想使用字符串'ABC''123'创建列表

['A1','B2','C3','A3','C1']

逻辑是按顺序将第一个字符串与第二个字符串配对,然后再次向后:

向前:A1,B2,C3 向后:A3,B2,C1

B2仅出现一次,因为最终列表应该是不同的值。

我应该能够扩展两个字符串中的每个字符串(它们的长度始终匹配)并具有相同的结果模式。

我尝试了几件事,但我想知道是否还有一种更Python化的方式来实现这一目标。

3 个答案:

答案 0 :(得分:1)

以下解决方案将在Python 3.x中工作,

from collections import OrderedDict

s1 ='ABC'
s2 = '123'

result = list(OrderedDict.fromkeys(first + second for first, second in zip(s1 + s1, s2 + s2[::-1])))
print(result)

输出

['A1', 'B2', 'C3', 'A3', 'C1']

第一个解决方案假定您只需要重复一次可迭代。如果您必须多次重复最短的迭代,则可以使用cycle在其上迭代几次:

from itertools import cycle

s1 ='ABC'
s2 = '123'

seen = set()
result = []
for first, second in zip(cycle(s1), s2 + s2[::-1]):
    first_second = first + second
    if first_second not in seen:
        seen.add(first_second)
        result.append(first_second)

print(result)

输出

['A1', 'B2', 'C3', 'A3', 'C1']

第二个解决方案中的想法是使用set可见元素,并且仅在看不见的情况下添加到最终结果中。最后,您可以组合解决方案并使用cycleOrderedDict

from itertools import cycle
from collections import OrderedDict

s1 ='ABC'
s2 = '123'

result = list(OrderedDict.fromkeys(first + second for first, second in zip(cycle(s1), s2 + s2[::-1])))
print(result)

输出

['A1', 'B2', 'C3', 'A3', 'C1']

答案 1 :(得分:1)

如果版本大于3.6:

print(list(map(''.join,list(dict.fromkeys(list(zip(s1,s2))+list(zip(s1,s2[::-1])))))))

输出:

['A1', 'B2', 'C3', 'A3', 'C1']

答案 2 :(得分:0)

  

我尝试了几件事,但我想知道是否还有更多   pythonic的方法来完成此任务。

不说您尝试过的方法,很难建议使用pythonic或其他方法。看看您在做什么,似乎您正在构建以下表单集之间的映射:

Set Mapping

就逻辑关系而言,这几乎是原子的;我不确定是否有任何方法比按索引的“笨拙的字符串连接”要快:

x = 'ABC'
y = '123'

new_list = [x[0] + y[0], x[1]+y[1], x[2]+y[2], x[0]+y[2], x[2]+y[0]]

输出:

['A1', 'B2', 'C3', 'A3', 'C1']