【问题标题】:Python: iterating over a list or unequal lengths [duplicate]Python:迭代列表或长度不等[重复]
【发布时间】:2016-06-13 22:57:31
【问题描述】:

从一个配置文件中,我想遍历一个包含usersrepositoriespassword 的列表,然后将这些值分配给变量以使用 github3.py 创建一个存储库对象。

userrepo_name 列表的长度不相等。目前,有两个用户和几个存储库,但这可能会随着时间的推移而改变。我尝试使用zip,但只有在列表长度相同时才有效。我希望它保留 user 列表中的最后一个值,并将其映射到 repo_name 列表中的最后一个 repo (user2,repo3)。

user = ["user1","user2"]
repo_name = ["repo1","repo2","repo3"]
password = "xxxxxxxxx"

下面的代码是我想使用这些值的地方。

from global_var import *
for users, repos in zip(user, repo_name)
    gh = login(users, password)
    repo = gh.repository(users, repos)
    list_all_prs()

【问题讨论】:

  • 如果用户列表比仓库列表长怎么办?
  • 用户列表永远不会长于存储库列表。存储库列表将始终等于或长于用户列表。

标签: python list iteration


【解决方案1】:

假设存储库列表总是至少和用户列表一样长,那么您可以简单地使用itertools.zip_longest 将它们压缩在一起:

for u, r in itertools.zip_longest(user, repo_name, fillvalue=user[-1]):
    ...

如您所见,zip 在最短的可迭代对象用完后结束。相比之下,zip_longest 将继续使用给定的fillvalue(默认为None),直到最长的可迭代对象用完为止。

所以在这里,我们可以简单地将fillvalue 设置为user 的最后一个成员,以便在剩余的存储库中广播它。

(在 python 2.7 中,这个迭代器被命名为itertools.izip_longest

【讨论】:

    【解决方案2】:

    使用哈希(我认为是 Python 中的字典)

    myHash = { 
        'user1': {
          'repos' : [],
          'password' : 'cat123'
      },
        'user2': {
          'repos' : [],
          'password' : 'cat123'
      },
    }
    

    你可以通过myHash['user1']['repos'][-1]获得最后一个回购

    【讨论】:

      【解决方案3】:

      使用 itertools 模块中的 izip_longest 方法压缩最长的可迭代对象。如果较短的列表中没有值,这将返回“None”,因此您需要在函数或循环中捕获它。

      import itertools as it
      
      a = []
      
          for user,repo in it.izip_longest(users,repo_name):
              if user: a.append((user,repo))
              else:  a.append((users[-1],repo))  
      
      a
      
      Output: [('user1', 'repo1'), ('user2', 'repo2'), ('user2', 'repo3')]
      

      【讨论】:

        【解决方案4】:

        我想说更好的方法是将每个用户映射到字典中的 repo,但最接近你想要的东西是这样的

        ##assuming repos.len() >= users.len() and users is not empty
        password = XXX
        while repos:
            if users:
                user = users.pop()
            gh = login(user, password)
            repo = gh.repository(user, repos.pop())
            list_all_prs()
        

        【讨论】:

          猜你喜欢
          • 2018-02-02
          • 2016-01-11
          • 1970-01-01
          • 2022-01-23
          • 2017-10-15
          • 2013-11-21
          • 2013-05-09
          • 2019-03-14
          • 2023-03-23
          相关资源
          最近更新 更多