Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文件值映射到列表时出现python代码错误_Python_List - Fatal编程技术网

将文件值映射到列表时出现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
    B
    ),将它们解包并将它们打包到一个单独的词典中。Slighlty(我的意思是稍微)比前面的方法更快,更不清晰。由@Nf4r提出
  • 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
    B
    ),将它们解包并将它们打包到一个单独的词典中。Slighlty(我的意思是稍微)比前面的方法更快,更不清晰。由@Nf4r提出
  • d=dict(A)
    &
    d.update(B)
    :将第一个列表转换为一个字典,并使用第二个列表的内容更新该字典。最快的方法是,每个列表一行代码,而不是任何列表一行代码,并且无需生成临时对象,因此内存效率更高

正如大家之前所说,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)])

正如大家之前所说,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不管怎样,在答案中包括所有建议的解决方案。创建两个字典来解压它们以创建第三个字典是一个糟糕的解决方案