使用 python 遍历多个列表

iterate through multiple lists with python

您好,我已经通过 Whosebug 进行了搜索,并且一直在努力应对以下与列表相关的挑战,但作为一个 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]]]

您的代码中有一些错误。

  • 您不需要循环 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]]]

这里有一些代码可以解决这个问题(虽然它不是最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 转换为字符串并将它们保存到 id_str_page_list 中,使用 [Python]: List Comprehensions 一次完成所有转换
  • 然后我遍历每个员工,如果在 1[= 的 2nd 列表中找到其 id 30=]st位置,我在另一个列表中"save"页码,最后(如果不为空)我将其附加到员工列表
  • 我将一些变量重命名为[Python]: PEP 8 -- Style Guide for Python Code 兼容

输出:

c:\Work\Dev\Whosebug\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]]]

您还可以将 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]]]

根据需要。

我同意 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() 与生成器一起使用意味着一旦找到匹配项就停止搜索列表。

我已更正您的代码

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)