将文件值映射到列表时出现python代码错误

时间:2016-11-23 15:46:50

标签: 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....

我想要一个读取此文件并将其映射到列表的代码。例如,如果文件有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)

2 个答案:

答案 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):首先将两个列表合并到一个列表中(不修改AB),然后将结果转换为字典。这是最明确的方法。
  • d = {**dict(A), **dict(B)}:将两个列表转换为两个单独的词典(不修改AB),解压缩并将它们打包到一个词典中。 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)])