在python中交错两个或多个列表的最佳方法?

时间:2018-05-13 02:45:10

标签: python performance list list-comprehension

假设我有一个清单:

l=['a','b','c']

及其后缀列表:

l2 = ['a_1', 'b_1', 'c_1']

我想要的输出是:

out_l = ['a','a_1','b','b_2','c','c_3']

结果是上面两个列表的交错版本。

我可以编写常规for循环来完成此操作,但我想知道是否有更多Pythonic方式(例如,使用列表理解或lambda)来完成它。

我尝试过这样的事情:

list(map(lambda x: x[1]+'_'+str(x[0]+1), enumerate(a)))
# this only returns ['a_1', 'b_2', 'c_3']

此外,对于一般情况需要做出哪些更改,即,l2不一定是l的衍生物的2个或更多列表?

5 个答案:

答案 0 :(得分:6)

你可以像这样使用列表理解:

from pyspark import SparkContext, SparkConf
conf = SparkConf().setMaster("local[2]").setAppName("Spark Count")
sc = SparkContext(conf=conf)

key_val = [ ('Key1', 'Value1'), ('Key1', 'Value2'), ('Key1', 'Value3'), ('Key2', 'Value4'), ('Key2', 'Value5') ]
kv = sc.parallelize(key_val)
kv_list = kv.map(lambda kv_tuple: (kv_tuple[0], [kv_tuple[1]]))
# Now reduce to concatinate lists
kv_desired = kv_list.reduceByKey(lambda a,b: a+b)
print(kv_desired.collect())

# Prints [('Key1', ['Value1', 'Value2', 'Value3']), ('Key2', ['Value4', 'Value5'])]

输出:

l=['a','b','c']
new_l = [i for b in [[a, '{}_{}'.format(a, i)] for i, a in enumerate(l, start=1)] for i in b]

可选,更短的方法:

['a', 'a_1', 'b', 'b_2', 'c', 'c_3']

答案 1 :(得分:2)

这是我的简单实现

l=['a','b','c']
# generate new list with the indices of the original list
new_list=l + ['{0}_{1}'.format(i, (l.index(i) + 1)) for i in l]
# sort the new list in ascending order
new_list.sort()
print new_list
# Should display ['a', 'a_1', 'b', 'b_2', 'c', 'c_3']

答案 2 :(得分:0)

如果你想返回[["a","a_1"],["b","b_2"],["c","c_3"]],你可以写

new_l=[[x,"{}_{}".format(x,i+1)] for i,x in enumerate(l)]

这不是您想要的,而是您想要的["a","a_1"]+["b","b_2"]+["c","c_3"]。这可以使用sum()从上面的操作结果中得出;由于您要汇总列表,因此需要将空列表添加为参数以避免错误。所以这给了

new_l=sum(([x,"{}_{}".format(x,i+1)] for i,x in enumerate(l)),[])

我不知道这是如何比较速度的(可能不太好),但我发现比其他基于列表理解的答案更容易理解发生了什么。

答案 3 :(得分:0)

一个非常简单的解决方案:

out_l=[]
for i,x in enumerate(l,1):
    out_l.extend([x,f"{x}_{i}"])

答案 4 :(得分:0)

以下是针对此问题的更容易理解的列表:

l = ['a', 'b', 'c']
print([ele for index, val in enumerate(l) for ele in (val, val + f'_{index + 1}')])

输出:

['a', 'a_1', 'b', 'b_2', 'c', 'c_3']

请注意,这只是交错两个列表的更简单解决方案。这不是针对多个列表的解决方案。我使用两个for循环的原因是,在撰写本文时,列表理解不支持元组拆包。