我需要比较两个列表,以便创建在一个列表中找到的特定元素的新列表,而不是在另一个列表中。例如:
main_list=[]
list_1=["a", "b", "c", "d", "e"]
list_2=["a", "f", "c", "m"]
我想在列表_1中循环,并将列表_2中未在列表_1中找到的所有元素附加到主列表。
结果应该是:
main_list=["f", "m"]
用python怎么做?
不确定当您有本机方法可用时,上述解释为何如此复杂:
main_list = list(set(list_2)-set(list_1))
TL; DR:
解决方案(1)
import numpy as np
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`
解决方案(2)您想要一个排序列表吗
def setdiff_sorted(array1,array2,assume_unique=False):
ans = np.setdiff1d(array1,array2,assume_unique).tolist()
if assume_unique:
return sorted(ans)
return ans
main_list = setdiff_sorted(list_2,list_1)
说明:
(1)您可以使用NumPy的setadi1d
(array1
,array2
,assume_unique
=False
)。
假设_unique
询问用户数组是否已经唯一
如果False
,则首先确定唯一元素
如果True
,函数将假定元素已经是唯一的,并且函数将跳过确定唯一元素。
这将在array1
中生成不在array2
中的唯一值<默认情况下,代码>假定_unique为False
。
如果您关心唯一元素(基于Chinny84的响应),那么只需使用(其中假设\u unique=False
=
import numpy as np
list_1 = ["a", "b", "c", "d", "e"]
list_2 = ["a", "f", "c", "m"]
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`
(2)对于那些想要排序答案的人,我做了一个自定义函数:
import numpy as np
def setdiff_sorted(array1,array2,assume_unique=False):
ans = np.setdiff1d(array1,array2,assume_unique).tolist()
if assume_unique:
return sorted(ans)
return ans
要获得答案,请运行:
main_list = setdiff_sorted(list_2,list_1)
旁注:
(a)解决方案2(自定义函数setdiff_sorted
)返回一个列表(与解决方案1中的数组相比)(b)如果您不确定元素是否唯一,只需在解决方案A和b中使用NumPy的默认设置setdiff1d
。什么是复杂的示例?见注(c)(c)如果这两个列表中的任何一个不是唯一的,事情就会不同
说列表2
不是唯一的:列表2=[“a”、“f”、“c”、“m”、“m”]
。保持列表1的原样:list_1=[“a”、“b”、“c”、“d”、“e”]
设置的默认值假定是唯一的
产生[“f”、“m”]
(在两种解决方案中)。但是,如果设置假设_unique=True
,两种解决方案都会给出[“f”、“m”、“m”]
。为什么?这是因为用户假定元素是唯一的)。因此,最好将假定_unique
保持为其默认值。请注意,两个答案都已排序。
蟒蛇
您可以使用集合:
main_list = list(set(list_2) - set(list_1))
输出:
>>> list_1=["a", "b", "c", "d", "e"]
>>> list_2=["a", "f", "c", "m"]
>>> set(list_2) - set(list_1)
set(['m', 'f'])
>>> list(set(list_2) - set(list_1))
['m', 'f']
根据@JonClements的评论,这里有一个更整洁的版本:
>>> list_1=["a", "b", "c", "d", "e"]
>>> list_2=["a", "f", "c", "m"]
>>> list(set(list_2).difference(list_1))
['m', 'f']
问题内容: 给出以下列表: 我想将[a]的每个元素重复其在[b]中的对应位置的编号,以产生此结果: 即0发生1次,5发生2次,1发生1次。 问题答案: 内容如下: -重复elem次 从两个列表中组成一个2元组的列表,将每个元素与另一个列表中的对应元素配对。这为您提供了用例中需要传递给的确切信息。 -将迭代器的结果列表展平为单个值列表。您既可以像我一样,也可以像马丁·彼得斯那样。
问题内容: 我必须找到一种最好的方法来找出第二个arraylist中未显示的元素。假设 因此,基本上我想要找出的是 a 在 数组列表b中 不存在的元素。 那么什么是最好的解决方案呢? 问题答案: 还可以考虑使用集合而不是列表。
问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:
问题内容: 如果我有这个: 然后在a中找到b: 有没有办法对列表做类似的事情?像这样: False的结果是可以理解的-因为它正确地寻找了一个元素’de’,而不是(我恰好想要它做的)’d’之后是’e’ 这是可行的,我知道: 我可以处理数据以获得所需的内容-但是有没有一种简短的Pythonic方式可以做到这一点? 需要说明的是:我需要在此处保留顺序(b = [‘e’,’d’],应返回False)。 如
问题内容: 我有两个带有不同对象的列表。 我想检查list2中的元素是否存在于list2中,基于特定的属性(Object1和Object2具有(以及其他),一个共有属性(类型为Long),名为attributeSame)。 现在,我这样做是这样的: 但是我认为有一种更好,更快的方法可以做到这一点:)有人可以提出吗? 谢谢! 问题答案: 如果只需要测试基本相等性,则可以使用基本JDK来完成,而无需在
我有两个不同对象的列表。 我想根据特定的属性(Object1和Object2有一个共同的属性(类型为Long),名为AttributeName),检查list2中是否存在list1中的元素。 现在,我是这样做的: 但我认为有更好更快的方法可以做到这一点:)有人能提出吗? 谢谢