Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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元素方面比较两个2d列表?_Python_Arrays_List_Compare_Difference - Fatal编程技术网

如何在python元素方面比较两个2d列表?

如何在python元素方面比较两个2d列表?,python,arrays,list,compare,difference,Python,Arrays,List,Compare,Difference,我有两个二维列表: 两者大小相同,但大小未知(对于不同的列表集不同) 例如: A = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Teacher'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']] B = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Police'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']] 我想

我有两个二维列表: 两者大小相同,但大小未知(对于不同的列表集不同)

例如:

A = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Teacher'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

B = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Police'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]
我想比较所有元素的文件元素(例如:
a[0][1]==b[0][1]
)并用元素索引打印差异

我希望输出如下内容:

a[1][2] = Teacher <> b[1][2] = Police
a[1][2]=老师b[1][2]=警察
如果我可以使用主键(ID)比较列表,以防列表与以下输出不一致,那就太好了:

Profession of ID = 1 does not match, i.e Teacher <> Police
ID=1的职业不匹配,即教师警察 注意:文件可能非常大(矩阵为100*10000)

谢谢。

试试这个:

A = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Teacher'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

B = [['ID', 'Name', 'Profession'], [1, 'Tom', 'Police'], [2, 'Dick', 'Actor'], [3, 'Harry', 'Lawyer']]

# If A and B have equal length
for k in range(len(A)):
    i = A[k]
    j = B[k]

    # If the nested lists of both A and B has same length
    l = len(i)-1
    while(l>=0):
        if not i[l] is j[l]:
            print(f"a[{k}][{l}] = {i[l]} <> b[{k}][{l}] = {j[l]}")
        l -= 1
A=[[ID]、[Name]、[Profession]、[1]、[Tom]、[Teacher]、[2]、[Dick]、[Actor]、[3]、[Harry]、[Lawyer]]
B=[[ID]、[Name]、[Profession]、[1]、[Tom]、[Police]、[2]、[Dick]、[Actor]、[3]、[Harry]、[Lawyer]]
#如果A和B的长度相等
对于范围内的k(len(A)):
i=A[k]
j=B[k]
#如果A和B的嵌套列表具有相同的长度
l=len(i)-1
而(l>=0):
如果不是,我是j[l]:
打印(f“a[{k}][{l}]={i[l]}b[{k}][{l}]={j[l]}”)
l-=1

以下代码应完成此工作:

for i in range(len(A)):
        B[i]
        A[i]
        if A[i] == B[i]: continue
        print(f'Differences in row{i}:', end='\n')
        for j in range(len(A[i])):
            if A[i][j] != B[i][j]:
                print(f'    in col {j}: A = {A[i][j]}, B = {B[i][j]}', end='\n')
对于给定的A、B,它将打印:

Differences in row1:
    in col 2: A = Teacher, B = Police
应该适用于您决定输入的任何数量的变量。 请注意,
f字符串
仅在python 3.6中引入,因此如果出现错误,可以更改为
string.format

您可以执行以下操作:

A=[[ID]、[Name]、[Profession]、[1]、[Tom]、[Teacher]、[2]、[Dick]、[Actor]、[3]、[Harry]、[Lawyer]]
B=[[ID]、[Name]、[Profession]、[1]、[Tom]、[Police]、[2]、[Dick]、[Actor]、[3]、[Harry]、[Lawyer]]
A={A[0]:{'Name':A[1],'Profession':A[2]}表示A在[1:]}
B={B[0]:{'Name':B[1],'Profession':B[2]}对于B[1:}中的B
对于\u id,a.items()中的\u内容:
a_profession=a_content['profession']
b_profession=b[a_id]['profession']
平等职业=a职业=b职业
匹配='matches'如果相等,则为'else'不匹配'
diff_profession=f“,即{a_profession}{b_profession}”,如果不等于{u profession else''
打印(f“ID的职业={a_ID}{match}{diff_Profession}”)
哪些输出:

>>> Profession of ID = 1 does not match, i.e Teacher <> Police
>>> Profession of ID = 2 matches
>>> Profession of ID = 3 matches

ID=1的职业不匹配,即教师警察 >>>ID的职业=2个匹配项 >>>ID的职业=3个匹配项
要使用主键比较列表元素,让我们使用字典按键索引它们:

A_dict={A[0]:A[1:]表示A}
B_dict={B[0]:B[1:]表示B}中的B
然后,迭代键和列并打印差异:

column\u names=A[0][1:]
对于目录键()中的id:
对于范围内的列(len(列名称)):
如果一个dict[id][column]!=B_dict[id][column]:
打印(ID={ID}的f{column_names[column]}不匹配,“
f“即{A_dict[id][column]}{B_dict[id][column]}”)
这将提供您想要的输出:

Profession of ID = 1 does not match, i.e Teacher <> Police
ID=1的职业不匹配,即教师警察 编辑:要回答您的评论,如果在第一个冒号中不需要您的ID,那么它会稍微复杂一些:

#获取“ID”列的编号
列名称=A[0]
column\u id=column\u names.index('id'))
#获取不带“ID”的列名
值\名称=列\名称[0:列\ id]+列\名称[列\ id+1:]
#在“column\u id”列中创建具有键的词典`
#值和其他列值的列表
A_dict={A[column_id]:A[0:column_id]+A[column_id+1:]表示A}
B_dict={B[column_id]:B[0:column_id]+B[column_id+1:]表示B}
#迭代键和其他列并打印差异
对于目录键()中的id:
对于范围内的列(列(列名称)-1):
如果一个dict[id][column]!=B_dict[id][column]:
打印(ID={ID}的f{values\u name[column]}不匹配,“
f“即{A_dict[id][column]}{B_dict[id][column]}”)

为什么这是列表列表而不是字典?是主键?列表对象没有主键。我可能会使用一个numpy数组,然后使用pandas groupby并简单地迭代新创建的数组来打印每个差异。ID在项中是否一定相等?i、 e-两个位置相同的项目是否可能具有不同的ID?请不要将嵌套列表称为2D列表。真正有两个维度的东西可以在任何一个维度中建立索引。如果我使用了你不熟悉的语法,请毫不犹豫地询问详细信息。我是编码新手。起初,这不是一份清单。它实际上是一个csv文件,我设法打开了它,并以某种方式转换成一个嵌套列表。你能帮我得到类似的结果来比较csv文件吗。您可以参考下面的链接了解详细问题:@Thoufeeque没问题,但我不明白的是:如果您设法打开CSV并将其转换为嵌套列表,为什么不能使用此答案比较列表?你有错误吗?没有,你的代码运行得很好。问题是,我只得到了两行的列表,这两行已经有很多步骤,我觉得这些步骤是不相关的。。希望你能理解。请回复,如果你有一个解决方案,更新后的代码在主键之前的所有列都可以正常工作。但是主键之后的所有列都使用列-1。对于名称列,它工作正常,但对于专业列,它打印为“id”输出示例:id=1的名称不匹配,即id=1的Tom Thomas id不匹配,即元素匹配时不应打印任何内容。根据您提供的代码,我得到以下输出:a[0][2]=专业b[0][2]=专业a[0][1]=姓名b[0][1]=姓名a[0][0]=身份证b[0][0]=身份证a[1][2]=教师b[1][2]=警察a[1][1]=汤姆a[2][2]=演员b[2][1]=迪克,但它只能是:a[1][2]=Te