与CSV

时间:2018-01-21 11:35:53

标签: python list indexing

我目前遇到一个问题是我的一个脚本。我试图实现以下规则:如果C3中的任何元素与C2中的任何元素匹配(空单元格除外)=>检查C1中与C3匹配元素具有相同索引的元素是否与C1中与C2 =>中匹配元素具有相同索引的元素匹配。如果是,则显示C4中具有索引作为C2匹配元素的元素。

输入是从中提取数据的Excel工作表,它看起来像这样:

C1  C2  C3  C4
P       A   
B       X   
C       K   
D       M   
P   B       B
P   A       D
C   D       E
D   E       K
E   M       W
F   F       Q
Q   F       Q

C1表示列'A',C2表示列'B',C3表示列'C',C4表示列'D'。在列的空白点我没有任何元素。

代码:

import openpyxl
import sys
C2=[None, None, None, None, 'B', 'A', 'D', 'E', 'M', 'F', 'F']
C3=['A', 'X', 'K', 'M', None, None, None, None, None, None, None]    
try:
                match=[name for name in C2 if name in C3]
                match=[i for i in match if i is not None]
except:
        print("No matches")
        sys.exit(1)
C2_index=C2.index(match)

我做了一些调试,如果在try部分打印匹配,我得到['A', 'M'],这是正确的。如果在编码后打印C2,我将获得[None, None, None, None, 'B', 'A', 'D', 'E', 'M', 'F', 'F'],这也是正确的。当我运行整个脚本时,我收到以下错误:

Traceback (most recent call last):
  File "test7.py", line 39, in <module>
    C2_index=C2.index(match)
ValueError: ['A', 'M'] is not in list

您能告诉我为什么C2没有识别这些元素吗?

2 个答案:

答案 0 :(得分:0)

解决方案

您正在列表中搜索列表。所以你现在正在设置:

C2 = [None, None, None, None, 'B', 'A', 'D', 'E', 'M', 'F', 'F']
match = ['A', 'M']

然后C2.index(match)在C2中查找列表['A','M']。有关.index方法的详细信息,请参阅the docs

要获取match中每个元素的索引,您可以使用列表解析:

[C2.index(m) for m in match]

返回

[5, 8]

答案 1 :(得分:0)

因为您没有搜索特定项目,所以无法在列表中找到它。您实际上是在搜索子列表。

试试这个:

C2_index =[]
for i in match:
  C2_index.append(C2.index(i))