假设我有一个清单:
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个或更多列表?
答案 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
循环的原因是,在撰写本文时,列表理解不支持元组拆包。