【问题标题】:python list comprehension and multiple variables [duplicate]python列表理解和多个变量[重复]
【发布时间】: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


    【解决方案1】:

    您可以在每对字符串上使用 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))
    

    【讨论】:

      【解决方案2】:

      我认为最好的方法是维护一个路径列表和一个操作,然后将它们合并到一个包含两个 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']
      

      【讨论】:

      • 同意 100%。我会挑剔你可能应该比for x in p for y in a更具描述性,而不是更倾向于for host in hosts for action in actions
      • 你是对的,我做出了改变。感谢您的评论
      【解决方案3】:

      您可以使用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'] 
      

      【讨论】:

        【解决方案4】:

        如果你不关心列表中项目的顺序,你可以这样做:

        ["https://%s/oauth2/idpresponse" % i for  i in p] + ["https://%s/auth2/idpresponse" % i for i in p]
        

        【讨论】:

          猜你喜欢
          • 2016-11-04
          • 2014-02-03
          • 1970-01-01
          • 2013-01-03
          • 2020-11-05
          • 1970-01-01
          • 2015-11-28
          • 2016-11-11
          相关资源
          最近更新 更多