将文件值映射到列表时出现python代码错误
我有两个列表的结构如下:将文件值映射到列表时出现python代码错误,python,list,Python,List,我有两个列表的结构如下: A= [[1,27],[2,27],[3,27],[4,28],[5,29]] B= [[6,30],[7,31],[8,31]] 我有一个有数字的文件: 1 5 2 3 3 1 4 2 5 5 6.... 我需要一个代码来读取此文件并将其映射到列表。e、 如果文件有1,它应该读取一个列表并输出27,如果它有6,它应该读取B并打印30,这样我就得到 27 29 27 27 27 27 28 27 29 29 30 31 问题
A= [[1,27],[2,27],[3,27],[4,28],[5,29]]
B= [[6,30],[7,31],[8,31]]
我有一个有数字的文件:
1 5
2 3
3 1
4 2
5 5
6....
我需要一个代码来读取此文件并将其映射到列表。e、 如果文件有1,它应该读取一个列表并输出27,如果它有6,它应该读取B并打印30,这样我就得到
27 29
27 27
27 27
28 27
29 29
30 31
问题是,我的代码给出了索引错误,我逐行读取文件,并有一个if条件检查我从文件读取的数字是否小于列表A中的最大数字,如果是,它将输出该列表的第二个字符,否则继续。问题是,我的程序并没有转到列表B,而是读取A并给出索引错误
with open(filename) as myfile:
for line in myfile.readlines():
parts=line.split()
if parts[0]< maxnumforA:
print A[int(parts[0])-1]
else:
print B[int(parts[0]-1)
打开(文件名)为myfile的:
对于myfile.readlines()中的行:
parts=line.split()
如果零件[0]
您应该将这些列表转换为字典。例如:
_A = dict(A)
_B = dict(B)
with open(filename) as myfile:
for line in myfile:
parts = line.split()
for part in parts:
part = int(part)
if part in _A:
print _A[part]
elif part in _B:
print _B[part]
如果将要发生的操作不需要知道它是来自A还是B,则两者都可以转换为一个字典:
d = dict(A + B) # Creating the dictionary
with open(filename) as myfile:
for line in myfile:
parts = line.split()
for part in parts:
part = int(part)
if part in d:
print d[part]
创建词典可以通过许多不同的方式完成,我将列出其中一些:
:首先将两个列表合并为一个列表(不修改d=dict(A+B)
或A
),然后将结果转换为字典。这是最清晰的方法B
:将两个列表转换为两个单独的词典(无需修改d={**dict(A),**dict(B)}
或A
),将它们解包并将它们打包到一个单独的词典中。Slighlty(我的意思是稍微)比前面的方法更快,更不清晰。由@Nf4r提出B
&d=dict(A)
:将第一个列表转换为一个字典,并使用第二个列表的内容更新该字典。最快的方法是,每个列表一行代码,而不是任何列表一行代码,并且无需生成临时对象,因此内存效率更高d.update(B)
_A = dict(A)
_B = dict(B)
with open(filename) as myfile:
for line in myfile:
parts = line.split()
for part in parts:
part = int(part)
if part in _A:
print _A[part]
elif part in _B:
print _B[part]
如果将要发生的操作不需要知道它是来自A还是B,则两者都可以转换为一个字典:
d = dict(A + B) # Creating the dictionary
with open(filename) as myfile:
for line in myfile:
parts = line.split()
for part in parts:
part = int(part)
if part in d:
print d[part]
创建词典可以通过许多不同的方式完成,我将列出其中一些:
:首先将两个列表合并为一个列表(不修改d=dict(A+B)
或A
),然后将结果转换为字典。这是最清晰的方法B
:将两个列表转换为两个单独的词典(无需修改d={**dict(A),**dict(B)}
或A
),将它们解包并将它们打包到一个单独的词典中。Slighlty(我的意思是稍微)比前面的方法更快,更不清晰。由@Nf4r提出B
&d=dict(A)
:将第一个列表转换为一个字典,并使用第二个列表的内容更新该字典。最快的方法是,每个列表一行代码,而不是任何列表一行代码,并且无需生成临时对象,因此内存效率更高d.update(B)
d = {**dict(A), **dict(B)} # available in Python 3.x
with open(filename) as file:
for line in file.readlines():
for num in line.split():
if int(num) in d:
print(d[int(num)])
正如大家之前所说,dict会更好。我不知道每个列表中的左侧值是否唯一,但如果是,您可以选择:
d = {**dict(A), **dict(B)} # available in Python 3.x
with open(filename) as file:
for line in file.readlines():
for num in line.split():
if int(num) in d:
print(d[int(num)])
如何获得
maxnumforA
?parts[0]
是一个字符串,如何将其与maxnumforA
(或者更确切地说,什么是maxnumforA
?)进行比较?为什么不使用字典而不是列表?是否有理由将列表拆分为两个变量?另外,您不需要调用file.readlines()
在文件中的行上进行迭代。对于文件中的行:
maxnumforA是29,我在我的代码前面定义了它。是的,我需要将数据拆分为两半,因为以后需要它。为了在代码中稍后使用,我无法将这两个列表合并显示您得到了maxnumforA
?部分[0]
是一个字符串,您如何将它与maxnumforA
(或者更确切地说,什么是maxnumforA
?)进行比较?为什么不使用字典而不是列表?是否有将列表拆分为两个变量的原因?另外,您不需要调用file.readlines()
在文件中的行上进行迭代。对于文件中的行:
maxnumforA是29,我在代码前面定义了它。是的,我需要将数据分成两半,因为以后需要它。为了在代码后面使用,我无法将两个列表合并感谢这有帮助。简单明了。解决了问题problem@LilySharpton如果你打算这样做同样,如果它位于A或B中,您可以稍微交换代码以使用单个dict,正如我在下面的评论中所建议的,编辑我的答案以包含此内容too@Adirio检查我对你下面陈述的回答,因为你错了。@Nf4r我检查过了,你的基准不正确,你正在将你的答案与虚构的答案进行比较。我的回答同样快和你的一样,更清晰。如果速度是必须的,那么更新是最快的方法。无论如何,将在答案中包含所有建议的解决方案。感谢这一帮助。简单明了。解决了问题problem@LilySharpton如果你要做同样的事情,如果它位于A或B,你可以交换一点代码来使用一个dict,就像我建议的那样d在下面的评论中,编辑我的答案以包含此内容too@Adirio请检查我对你下面陈述的回答,因为你错了。@Nf4r我检查过了,你的基准不正确,你正在将你的答案与虚构的答案进行比较。我的答案和你的答案一样快,而且更清楚。如果速度是必须的,那么更新是最快的方法。Wil不管怎样,在答案中包括所有建议的解决方案。创建两个字典来解压它们以创建第三个字典是一个糟糕的解决方案