使用 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)
您好,我已经通过 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)