比较两个列表';索引值并将不相似的值写入Python中的另一个列表

比较两个列表';索引值并将不相似的值写入Python中的另一个列表,python,arrays,list,Python,Arrays,List,考虑以下列表: list_one = ['0414870590', '3965667115', '7686006277', '0736885667', '2580894453', '4890895590'] 及 我只想找到list\u one中的条目与list\u two[j][3]中的条目不相等的条目。 这是我认为可行的,因为它看起来很合乎逻辑,但似乎有缺陷 list_only_not_similar = [] for i in list_one: for j in list_tw

考虑以下列表:

list_one = ['0414870590', '3965667115', '7686006277', '0736885667', '2580894453', '4890895590']

我只想找到
list\u one
中的条目与
list\u two[j][3]
中的条目不相等的条目。 这是我认为可行的,因为它看起来很合乎逻辑,但似乎有缺陷

list_only_not_similar = []

for i in list_one:
    for j in list_two:
        if i != j[3]:
            list_only_not_similar.append(j)
如果我一切正常,因为只有一个匹配(
列出一个[0]
->
'0414870590'
list\u two[0][3]
->
'0414870590'
),这意味着
list\u only\u not\u simple
数组的长度将是
8
。 但是它是
53

>>> len(list_only_not_similar)
53
因此,我希望列表中的输出仅与之类似:

[['2', 'zhwgvdwoif', '1', '8201315776', 'foo', 'bar'], 
['3', 'jbimbttwmo', '1', '4366752905', 'foo', 'bar'], 
['4', 'dalroxsqxt', '1', '0652459418', 'foo', 'bar'], 
['5', 'jbygszsfcw', '1', '1876053449', 'foo', 'bar'], 
['6', 'hcbrgydtxx', '1', '1138310041', 'foo', 'bar'], 
['7', 'rlkadtqarj', '1', '7479978778', 'foo', 'bar'], 
['8', 'koafneqxgh', '1', '0539402828', 'foo', 'bar'], 
['9', 'lsaakfoqdf', '1', '0300592696', 'foo', 'bar']]

您应该交换循环位置,并针对每个i元素检查每个j元素,并且仅当i元素与您感兴趣的字段都不相同时,才将其添加到结果列表中

list_only_not_similar = []
for j in list_two:
    f = True
    for i in list_one:
        if i == j[3]:
            f = False
            break
    if f:
        list_only_not_similar.append(j)

事实上,您为每个i元素添加了每个合适的j元素,但是您应该针对每个i元素检查每个j元素,并且只有在检查了所有i元素的情况下才将其添加到结果列表中。还有一个中断,因为如果您发现至少有一个元素相等-您不必检查其他元素-该行无论如何都不符合结果。

您应该交换循环位置,并针对每个i元素检查每个j元素,并且仅当i元素与您感兴趣的字段都不相同时,才将其添加到结果列表中

list_only_not_similar = []
for j in list_two:
    f = True
    for i in list_one:
        if i == j[3]:
            f = False
            break
    if f:
        list_only_not_similar.append(j)
[sublist for sublist in list_two if sublist[3] not in list_one]

事实上,您为每个i元素添加了每个合适的j元素,但是您应该针对每个i元素检查每个j元素,并且只有在检查了所有i元素的情况下才将其添加到结果列表中。还有一个中断,因为如果您发现至少有一个元素相等-您不必检查其他元素-该行无论如何都不在结果中。

您不需要迭代列表,因为简单的IN语句就足够了:

[sublist for sublist in list_two if sublist[3] not in list_one]
list_one = ['0414870590', '3965667115', '7686006277', '0736885667', '2580894453', '4890895590']

list_two = [['1', 'acppkbgrfi', '1', '0414870590', 'foo', 'bar'],
            ['2', 'zhwgvdwoif', '1', '8201315776', 'foo', 'bar'],
            ['3', 'jbimbttwmo', '1', '4366752905', 'foo', 'bar'],
            ['4', 'dalroxsqxt', '1', '0652459418', 'foo', 'bar'],
            ['5', 'jbygszsfcw', '1', '1876053449', 'foo', 'bar'],
            ['6', 'hcbrgydtxx', '1', '1138310041', 'foo', 'bar'],
            ['7', 'rlkadtqarj', '1', '7479978778', 'foo', 'bar'],
            ['8', 'koafneqxgh', '1', '0539402828', 'foo', 'bar'],
            ['9', 'lsaakfoqdf', '1', '0300592696', 'foo', 'bar']]

list_only_not_similar = []

# make a set from list for performance purpose
set_one = set(list_one)

for j in list_two:
    if j[3] not in set_one:
        list_only_not_similar.append(j)

print len(list_only_not_similar)
输出将是:

8

您不需要迭代list_one,因为简单的IN语句就足够了:

list_one = ['0414870590', '3965667115', '7686006277', '0736885667', '2580894453', '4890895590']

list_two = [['1', 'acppkbgrfi', '1', '0414870590', 'foo', 'bar'],
            ['2', 'zhwgvdwoif', '1', '8201315776', 'foo', 'bar'],
            ['3', 'jbimbttwmo', '1', '4366752905', 'foo', 'bar'],
            ['4', 'dalroxsqxt', '1', '0652459418', 'foo', 'bar'],
            ['5', 'jbygszsfcw', '1', '1876053449', 'foo', 'bar'],
            ['6', 'hcbrgydtxx', '1', '1138310041', 'foo', 'bar'],
            ['7', 'rlkadtqarj', '1', '7479978778', 'foo', 'bar'],
            ['8', 'koafneqxgh', '1', '0539402828', 'foo', 'bar'],
            ['9', 'lsaakfoqdf', '1', '0300592696', 'foo', 'bar']]

list_only_not_similar = []

# make a set from list for performance purpose
set_one = set(list_one)

for j in list_two:
    if j[3] not in set_one:
        list_only_not_similar.append(j)

print len(list_only_not_similar)
输出将是:

8

这是因为对于
list\u two
中的每个值,如果它不等于
list\u two[j][3]
中的值,则添加的是
list\u one
中的值

您可以通过计算每个值在
list\u only\u not\u similor
中出现的次数,并将其与
list\u two
的长度进行比较,来调整当前的解决方案。在任何元素中都找不到长度相等的任何内容

但那太可怕了,不要那样做

如何解决问题 用英语写 我发现要想得到我想要的东西,最好的办法是写下我要向某人解释的内容:

我需要
list\u two
中的所有值,其中第三个值在
list\u one中找不到

从这里开始,将其转换为Python不需要太多的时间:

values_i_want= []
for value in list_two:
    if not value[3] in list_one:
        values_i_want.append(value)
优化 但是,根据
list_one
list_two
中的值数量,您可能会发现这需要很长时间。这是因为Python中的比较非常昂贵,如果值不在
list\u one
中,您将执行
N*N
(或
O(N
<2
)比较。太多了

通过将
list\u one
更改为一个集合,可以大幅减少比较次数:

set_one = set(list_one)
因为集合是基于散列值的,所以您已将查找更改为每个值的固定时间,因此您查看的不是
N*N
比较,而是
N*1

简化(重构) 现在,一旦您有了这段代码,您就可以通过将其转换为列表理解来简化,就像Hackaholic所做的那样:

values_I_want = [value for value in list_two if list_two[3] not in set_one]
当然,
values\u I\u want
不是最好的变量名,因此您可以:

list_not_similar = [x for x in list_two if x[3] not in set_one]

随着您对语言和编程的熟悉程度的提高,对于像这样的小问题,您可以直接从听到问题跳到编写最终代码,但是现在不要太担心是否能够做到这一点。

这是因为对于
list\u two
中的每个值,如果它不等于
list\u one
中的值,那么您将添加
list\u two[j][3]
中的值

您可以通过计算每个值在
list\u only\u not\u similor
中出现的次数,并将其与
list\u two
的长度进行比较,来调整当前的解决方案。在任何元素中都找不到长度相等的任何内容

但那太可怕了,不要那样做

如何解决问题 用英语写 我发现要想得到我想要的东西,最好的办法是写下我要向某人解释的内容:

我需要
list\u two
中的所有值,其中第三个值在
list\u one中找不到

从这里开始,将其转换为Python不需要太多的时间:

values_i_want= []
for value in list_two:
    if not value[3] in list_one:
        values_i_want.append(value)
优化 但是,根据
list_one
list_two
中的值数量,您可能会发现这需要很长时间。这是因为Python中的比较非常昂贵,如果值不在
list\u one
中,您将执行
N*N
(或
O(N
<2
)比较。太多了

通过将
list\u one
更改为一个集合,可以大幅减少比较次数:

set_one = set(list_one)
因为集合是基于散列值的,所以您已将查找更改为每个值的固定时间,因此您查看的不是
N*N
比较,而是
N*1

简化(重构) 现在,一旦您有了这段代码,您就可以通过将其转换为列表理解来简化,就像Hackaholic所做的那样:

values_I_want = [value for value in list_two if list_two[3] not in set_one]
当然,
values\u I\u want
不是最好的变量名,因此您可以:

list_not_similar = [x for x in list_two if x[3] not in set_one]
随着您对该语言和编程越来越熟悉,对于像这样的小问题,您可以经常跳转到stra