如何一次比较二维数组的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
。
比较c
与a
和b
的转储(参见输入单元格#4)
In [6]: c
Out[6]: [[1, 1, 0], [1, 1, 1], [1, 0, 1]]
In [7]:
在我看来,这里提出的列表理解程序是正确的。
【讨论】:
以上是关于如何一次比较二维数组的2列与python中另一个数组的列的主要内容,如果未能解决你的问题,请参考以下文章
将一个数据帧的数组列与scala中另一个数据帧的数组列的子集进行比较
如何在不使用collect()和for循环的情况下将一个(IP地址)的特定部分与RDD python pyspark中另一列中的其他IP地址进行比较