我有两个这样的结构列表:
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....
我想要一个读取此文件并将其映射到列表的代码。例如,如果文件有1,它应该读取A列表并输出27,如果它有6,它应该读取B并打印30,这样我得到
27 29
27 27
27 27
28 27
29 29
30 31
问题是,我的代码给出索引错误,我逐行读取文件并有一个if条件,检查我从文件中读取的数字是否小于列表A中的最大数量,如果是这样,它输出该列表的第二个字符,否则继续前进。问题是,我的程序仍然读取A并给出索引错误,而不是转到列表B。
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)
答案 0 :(得分:3)
您应该将该列表转换为词典。例如:
_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
或B
),解压缩并将它们打包到一个词典中。 Slighlty(我的意思是真的稍微)比以前的方法更快,而且不太清楚。由@ Nf4r提出d = dict(A)
&amp; d.update(B)
:将第一个列表转换为字典,并使用第二个列表的内容更新该字典。最快的方法,每个列表1行代码,而不是任何列表的1行,没有临时对象生成,因此内存更有效。答案 1 :(得分:0)
正如大家之前所说,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)])