【发布时间】:2021-06-30 14:36:56
【问题描述】:
我想将我的代码压缩成一行。
p = ['https://mysitea.com', 'https://mysiteb.com']
x = []
for i in p:
x.append(f"https://{i}/oauth2/idpresponse")
x.append(f"https://{i}/auth")
是否可以使用列表压缩来执行它?
【问题讨论】:
标签: python
我想将我的代码压缩成一行。
p = ['https://mysitea.com', 'https://mysiteb.com']
x = []
for i in p:
x.append(f"https://{i}/oauth2/idpresponse")
x.append(f"https://{i}/auth")
是否可以使用列表压缩来执行它?
【问题讨论】:
标签: python
您可以在每对字符串上使用 itertools 中的 chain.from_iterable
from itertools import chain
x = list(chain.from_iterable((f"https://{i}/oauth2/idpresponse", f"https://{i}/auth") for i in p))
【讨论】:
我认为最好的方法是维护一个路径列表和一个操作,然后将它们合并到一个包含两个 for 嵌套循环的单个列表压缩中。
hosts = ['https://mysitea.com', 'https://mysiteb.com']
actions = ['/oauth2/idpresponse', '/auth']
[host+action for host in hosts for action in actions]
打印
['https://mysitea.com/oauth2/idpresponse',
'https://mysitea.com/auth',
'https://mysiteb.com/oauth2/idpresponse',
'https://mysiteb.com/auth']
【讨论】:
for x in p for y in a更具描述性,而不是更倾向于for host in hosts for action in actions
您可以使用list compression 中的if-else 来实现。但我相信有更好的方法来实现。
代码:
p = ['https://mysitea.com', 'https://mysiteb.com']
print([f"https://{i}/oauth2/idpresponse" if idx%2 == 0 else f"https://{i}/auth" for idx,i in enumerate(p*2)])
结果:
['https://https://mysitea.com/oauth2/idpresponse', 'https://https://mysiteb.com/auth', 'https://https://mysitea.com/oauth2/idpresponse', 'https://https://mysiteb.com/auth']
编辑:更好的使用方式sum
代码:
print(sum(([f"https://{i}/oauth2/idpresponse",f"https://{i}/auth"] for i in p),[]))
结果:
['https://https://mysitea.com/oauth2/idpresponse', 'https://https://mysitea.com/auth', 'https://https://mysiteb.com/oauth2/idpresponse', 'https://https://mysiteb.com/auth']
【讨论】:
如果你不关心列表中项目的顺序,你可以这样做:
["https://%s/oauth2/idpresponse" % i for i in p] + ["https://%s/auth2/idpresponse" % i for i in p]
【讨论】: