如何一次比较二维数组的2列与python中另一个数组的列

Posted

技术标签:

【中文标题】如何一次比较二维数组的2列与python中另一个数组的列【英文标题】:how to compare 2 columns of a 2d array at a time with columns of another array in python 【发布时间】:2018-04-02 17:22:04 【问题描述】:

我有两个字符串数组,每个数组都有三列。我想比较两个二维数组的前两列(有 3 列和 4000 行)。如果它们匹配,那么我需要那些匹配的值。但是我的代码不起作用。这是一个示例。

array1=["1stcolumn...", "2ndColumn...", "3rdColumn..."]
array2=[1stcolumn 2ndColumn 3rdColumn]
if (array1[0]==array2[0] and array1[1]==array2[1]):
       array3.append('matches: !r'.format(array1))
print(array3)

【问题讨论】:

...my code is not working 有什么问题吗?它打印什么? & 如果在等价测试周围有括号,则可以使用。 @Wyatt 在 Python 中,列表称为列表,数组称为数组。列表不是数组。 它正在打印没有匹配的完整数组。 【参考方案1】:

编辑

if array1[:2] == array2[:2]: 比较索引 0 到 2(不包括 2)的所有项目,得出与if array1[0] == array2[0] and array1[1] == array2[1]: 相同的结果。此外,它更简单。(感谢怀亚特的评论)

如果你的数组是二维的:

def compare_columns(array1, array2):
    if len(array1) != len(array2):
        return False # If row numbers are not same, return false

    for row_number in range(len(array1)):
        if array1[row_number][:2] != array2[row_number][:2]:
            return False # If the content is not equal, return false

    return True # All of the content is equal, the return true

# For example, these are 2-dimensional arrays
array1 = [["1.1", "1.2", "Lord of the Day of Judgment!"],
          ["2.1", "2.2", "Lord of the Day of Judgment!"]]
array2 = [["1.1", "1.2", "مَالِكِ يَوْمِ الدِّينِ"],
          ["2.1", "2.2", "مَالِكِ يَوْمِ الدِّينِ"]]

array3 = []       
if compare_columns(array1, array2):
       array3.append('matches: !r'.format(array1))
print(array3)

输出:

["matches: [['1.1', '1.2', 'Lord of the Day of Judgment!'], ['2.1', '2.2', 'Lord of the Day of Judgment!']]"]

编辑前:

如果你的数组是一维的,你不需要说列,它只是项。那么你的工作就像你上面所做的那样简单。只是,您有一些语法错误。使用此代码:

array1 = ["1stcolumn", "2ndColumn", "1-3rdColumn"]
array2 = ["1stcolumn", "2ndColumn", "2-3rdColumn"]
array3 = []
if array1[0] == array2[0] and array1[1] == array2[1]:
       array3.append('matches: !r'.format(array1))
print(array3)

输出:

["matches: ['1stcolumn', '2ndColumn', '1-3rdColumn']"]

所以,如果您有任何其他问题,请告诉我们。

【讨论】:

也可以使用array1[:2] == array2[:2]进行比较。 我的数组是二维的。两个数组都有 3 列和 4000 行。那么,我们如何匹配二维数组呢? 是的,实际上,这是一个更好的方法。但是,我并不想对原来的代码做太多改动。 @Nisa 我编辑了二维数组的答案。如果我的回答不起作用并且您的问题仍然存在,请分享您的阵列的一部分,然后让我们知道更多详细信息。 谢谢..但是您的代码正在检查行数是否相等..我需要比较两个数组的前两列的内容并检索匹配的索引,我还需要循环通过数组的所有行进行比较。这是我的示例数组:array1=[''1","4","审判日之主!''] array2=["1","4", "مَالِكِ يَوْمِ الدِّينِ"]【参考方案2】:

此代码 sn-p 中有许多错误,这将阻止它甚至在没有错误的情况下运行。

Python 列表在元素之间用逗号声明。例如, 字符串列表的声明可以是:

array1 = ["this", "is", "a", "list"]

在Python中使用列表的例子(3)可以找到here。

Python 逻辑“与”运算符不是 &。它是and。看 this问题。

在 Python 中,与大多数语言一样,变量必须先声明 他们可以参考。在您的代码中,永远不会声明 array3。你 总是可以像这样声明一个空列表:

array3 = []

【讨论】:

【参考方案3】:

一如既往,我们需要一个样本数据集

In [1]: from random import randint

In [2]: a = [[randint(0, 1) for _ in range(3)] for __ in range(10)]

In [3]: b = [[randint(0, 1) for _ in range(3)] for __ in range(10)]

看看吧

In [4]: for aa, bb in zip(a, b): print(aa, bb)
[1, 1, 0] [0, 1, 0]
[0, 0, 0] [1, 0, 0]
[1, 1, 0] [1, 1, 0]
[1, 1, 0] [0, 1, 0]
[0, 0, 0] [1, 0, 0]
[0, 0, 0] [1, 0, 1]
[1, 1, 1] [1, 1, 1]
[0, 1, 0] [1, 0, 0]
[1, 0, 1] [1, 0, 1]
[1, 1, 1] [1, 0, 0]

貌似有几个候选... 看看能不能把第一个列表的子列表中前2个元素等于对应的 第二个列表中相应子列表的元素。

一种可能的解决方案涉及列表解析,使用zip 配对相应的子列表并根据我们的标准进行过滤:

In [5]: c = [aa for (aa, bb) in zip(a, b) if aa[:2]==bb[:2]]

在子列表的两个切片上进行比较,避免使用逻辑运算符and

比较cab 的转储(参见输入单元格#4)

In [6]: c
Out[6]: [[1, 1, 0], [1, 1, 1], [1, 0, 1]]

In [7]: 

在我看来,这里提出的列表理解程序是正确的。

【讨论】:

以上是关于如何一次比较二维数组的2列与python中另一个数组的列的主要内容,如果未能解决你的问题,请参考以下文章

将一个数据帧的数组列与scala中另一个数据帧的数组列的子集进行比较

将表中的列与 hive 中另一个表的列进行比较

如何在不使用collect()和for循环的情况下将一个(IP地址)的特定部分与RDD python pyspark中另一列中的其他IP地址进行比较

如果同一行中另一列中的值匹配,如何比较列的两个值

如何根据Python中另一列中的日期查找最频繁的值

将一列与另一数据框列匹配并粘贴第二个数据中的值 - Python