mpt*_*ion 12 python list concatenation
如果有这样的列表:
shops=['A','B','C','D']
Run Code Online (Sandbox Code Playgroud)
并且想要创建以下新列表(我将每个元素彼此交叉并创建一个字符串,其中第一部分在第二部分之前是字母数字):
['A-B', 'A-C', 'A-D']
['A-B', 'B-C', 'B-D']
['A-C', 'B-C', 'C-D']
['A-D', 'B-D', 'C-D']
Run Code Online (Sandbox Code Playgroud)
我有这样的事情:
for a in shops:
cons = []
for b in shops:
if a!=b:
con = [a,b]
con = sorted(con, key=lambda x: float(x))
cons.append(con[0]+'-'+con[1])
print(cons)
Run Code Online (Sandbox Code Playgroud)
但是,这对于大型列表来说相当慢(例如1000,其中我有1000*999*0.5输出).我一直在寻找一种更有效的方法吗?
我可以使用if-else子句进行排序,例如
for a in shops:
cons = []
for b in shops:
if a<b:
cons.append(a+"-"+b)
elif a>b:
cons.append(b+"-"+a)
print(cons)
Run Code Online (Sandbox Code Playgroud)
哪个,我还没有定时 - 但我认为主要的减速是双循环
您可以使用一些额外的检查创建嵌套列表理解:
>>> shops=['A','B','C','D']
>>> [["-".join((min(a,b), max(a,b))) for b in shops if b != a] for a in shops]
[['A-B', 'A-C', 'A-D'],
['A-B', 'B-C', 'B-D'],
['A-C', 'B-C', 'C-D'],
['A-D', 'B-D', 'C-D']]
Run Code Online (Sandbox Code Playgroud)
请注意,这可能不会比您的代码快得多,因为您仍然必须生成所有这些组合.在实践中,您可以将其设置为生成器表达式,因此元素不会一次全部生成,而只是"根据需要"生成:
gen = (["-".join((min(a,b), max(a,b))) for b in shops if b != a] for a in shops)
for item in gen:
print(item)
Run Code Online (Sandbox Code Playgroud)
更新:我使用IPython进行了一些时序分析%timeit.结果证明你的第二次实施是最快的.测试了100个字符串(map(str, range(100)))的列表,并将每个方法转换为生成器.
In [32]: %timeit list(test.f1()) # your first implementation
100 loops, best of 3: 13.5 ms per loop
In [33]: %timeit list(test.f2()) # your second implementation
1000 loops, best of 3: 1.63 ms per loop
In [34]: %timeit list(test.g()) # my implementation
100 loops, best of 3: 3.49 ms per loop
Run Code Online (Sandbox Code Playgroud)
您可以通过使用简单if/else而不是min/max像第二个实现中那样加快速度,然后它们的速度相同.
(["-".join((a,b) if a < b else (b,a)) for b in shops if b != a] for a in shops)
Run Code Online (Sandbox Code Playgroud)