比较两个列表';索引值并将不相似的值写入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