【问题标题】:iterate through multiple lists with python用python遍历多个列表
【发布时间】:2018-04-25 17:20:06
【问题描述】:

您好,我已经通过 Stackoverflow 进行了搜索,并且一直在努力应对以下与列表相关的挑战,但作为一名 Python 新手,我很难过。

我目前有 2 个测试数据列表,一个包含用户信息(新旧用户 ID 后跟名称数据),另一个包含用户和页码列表 (eeIDlist)。我想检查与特定用户关联的页码是否与新 ID 或旧 ID 匹配,如果任一 ID 匹配,则将页码附加回原始列表。

我已经将一个列表匹配并附加到 CompanyName 列表,但该列表似乎呈指数级增长并代表所有用户页面数据,而不仅仅是与个人相关的页码。

热烈欢迎建议!

我的代码如下:

pagenumbers=[]

for i in CompanyNameList:

    for ee in i:
        for eeid in eeIDlist:
            try:
                if (str(eeid[1]) in ee):
                    pagenumbers.extend([eeid[0]]) 
                    i.append(pagenumbers)
                    i.append([eeid[0]])
            except ValueError:
                print "Not a valid number"

print i

我的源数据如下:

CompanyNameList:

[['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ'],['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ'],['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG'],['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE']] 

用户 ID 和页码 eeIDlist:

[[144128,1],[144138,12],[144130,6],[144131,9],[40013,153],[40074,310],[40023, 210], 
[40050,250]] 

所需的输出列表:

[['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ',[1,153]],
['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ',[6,210]], 
['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG',[9,250]],
['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE',[12,310]]]

【问题讨论】:

  • i.append(pagenumbers) 的目的是什么?该代码是个坏消息,您将多个引用附加到正在扩展的列表中。

标签: python list append extend


【解决方案1】:

我同意 Robbie 的观点,即 eeIDlist 应该是一个字典......但除此之外,这是使用您的列表的解决方案。

for c in CompanyNameList:
    c.append([
        next(e[1] for e in eeIDlist if e[0] == int(c[0])),
        next(e[1] for e in eeIDlist if e[0] == int(c[1])),
    ])
    print(c)

next() 与生成器一起使用意味着一旦找到匹配项就会停止搜索列表。

【讨论】:

    【解决方案2】:

    我已经更正了你的代码

    CompanyNameList = [['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ'],['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ'],['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG'],['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE']]
    eeIDlist = [[144128,1],[144138,12],[144130,6],[144131,9],[40013,153],[40074,310],[40023, 210], [40050,250]]
    
    for CompanyName in CompanyNameList:
        pageList = []
        newID = int(CompanyName[0])
        oldID = int(CompanyName[1])
        for eeID in eeIDlist:
            if eeID[0] == newID or eeID[0] == oldID:
                pageList.append(eeID[1])
        CompanyName.append(pageList)
    
    print(CompanyNameList)
    

    【讨论】:

    • 如果你解释为什么它被修复以及你是如何做到的,它会更有用。这样,具有相似但不完全相同问题的人将能够纠正他们的问题,并且 OP 将理解该问题以防止重复
    【解决方案3】:

    您还可以将 eeIDlist 转换为字典,这样可以加快搜索速度。这也可以让您在一行中执行整个操作:

    eeIDdict = dict(eeIDlist)
    [j.append([eeIDdict[int(k)] for k in j[0:2]]) for j in CompanyNameList]
    

    现在我们有了:

    CompanyNameList = 
    [['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ', [1, 153]],
    ['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ', [6, 210]],
    ['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG', [9, 250]],
    ['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE', [12, 310]]]
    

    根据需要。

    【讨论】:

      【解决方案4】:

      您的代码中有一些错误。

      • 您不需要循环 for ee in i。你想检查'123214' in ['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ'] 例如不是123214'144128''40013''John' 等中。

      • 另外,你不需要i.append([eeid[0]]),因为你正在处理pagenumbers,这就够了;您不希望结果中出现重复项。

      • 此外,pagenumbers 应附加在 for 循环之外。否则,您将获得多个列表。

      以下是修复代码错误的代码:

      CompanyNameList = [
          ['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ'],
          ['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ'],
          ['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG'],
          ['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE']]
      
      eeIDlist = [[144128,1],
                  [144138,12],
                  [144130,6],
                  [144131,9],
                  [40013,153],
                  [40074,310],
                  [40023, 210], 
                  [40050,250]] 
      
      pagenumbers=[]
      
      for i in CompanyNameList:
          for eeid in eeIDlist:
              try:
                  # eeid[0] not eeid[1] 
                  if (str(eeid[0]) in i): 
                      # eeid[1] not eeid[0]
                      pagenumbers.extend([eeid[1]])
              except ValueError:
                  print ("Not a valid number")
          i.append(pagenumbers)
          pagenumbers = []
      
      print CompanyNameList
      

      输出:

      [['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ', [1, 153]], 
       ['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ', [6, 210]], 
       ['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG', [9, 250]], 
       ['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE', [12, 310]]]
      

      【讨论】:

      • 感谢您花时间回答我的问题,您的回答和详细解释非常有帮助。
      【解决方案5】:

      这里有一些代码可以解决问题(虽然它不是最pythonic):

      from pprint import pprint as pp
      
      company_name_list = [['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ'],
                           ['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ'],
                           ['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG'],
                           ['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE']]
      
      id_page_list = [[144128, 1],
                      [144138, 12],
                      [144130, 6],
                      [144131, 9],
                      [40013, 153],
                      [40074, 310],
                      [40023, 210],
                      [40050, 250]]
      
      
      if __name__ == "__main__":
          id_str_page_list = [[str(item[0]), item[1]] for item in id_page_list]
          for employee in company_name_list:
              pages_list = list()
              for id_page in id_str_page_list:
                  if id_page[0] == employee[0] or \
                          id_page[0] == employee[1]:
                      pages_list.append(id_page[1])
              if pages_list:
                  employee.append(pages_list)
      
          pp(company_name_list)
      

      注意事项

      • 我将整数 id 从 id_str_page 转换为字符串,并使用 [Python]: List Comprehensions 将它们保存到 id_str_page_list 中,以便一次完成所有转换
      • 然后我对每个员工进行迭代,如果在第 1st 位置的 2nd 列表中找到其 id 之一,我将页码“保存”在另一个列表中,最后(如果不为空)我将其附加到员工列表中
      • 我将一些变量重命名为[Python]: PEP 8 -- Style Guide for Python Code 兼容

      输出

      c:\Work\Dev\StackOverflow\q47257333>"c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" a.py
      [['144128', '40013', 'John', 'Dodge', 'F', 'DODGEJ', [1, 153]],
       ['144130', '40023', 'John', 'Apple', 'Z', 'APPLEJ', [6, 210]],
       ['144131', '40050', 'Gerald', 'Key', 'M', 'KEYG', [9, 250]],
       ['144138', '40074', 'Saul', 'VanWinkle', 'VANWINKLE', [12, 310]]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-01
        • 2013-02-18
        • 1970-01-01
        • 2018-03-08
        • 2015-10-07
        • 2013-07-13
        相关资源
        最近更新 更多