gpt4 book ai didi

python - 在列表中快速交叉字符串的方法

转载 作者:太空狗 更新时间:2023-10-29 17:45:19 25 4
gpt4 key购买 nike

如果有这样一个列表:

shops=['A','B','C','D']

并想创建以下新列表(我将每个元素相互交叉并创建一个字符串,其中第一部分在第二部分之前按字母数字顺序排列):

['A-B', 'A-C', 'A-D']

['A-B', 'B-C', 'B-D']

['A-C', 'B-C', 'C-D']

['A-D', 'B-D', 'C-D']

我有这样的东西:

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)

但是,对于大型列表(例如 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)

哪个,我还没有计时 - 但是我认为主要的减速是双 for 循环

最佳答案

您可以创建带有一些额外检查的嵌套列表理解:

>>> 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']]

请注意,这可能不会比您的代码快多少,因为您仍然需要生成所有这些组合。在实践中,您可以将其设为生成器表达式,因此不会一次生成所有元素,而是仅“根据需要”生成元素:

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)

更新:我使用 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

您可以通过使用简单的 if/else 而不是 min/max 来加快速度,就像在您的第二个实现中一样,那么它们的速度差不多。

(["-".join((a,b) if a < b else (b,a)) for b in shops if b != a] for a in shops)

关于python - 在列表中快速交叉字符串的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com