在Python中,如何减去两个非唯一的无序列表?假设我们有a = [0,1,2,1,0]和b = [0, 1, 1]我想这样做c = a - b,并有c成为[2, 0]或[0, 2]顺序并不重要,对我来说.如果a不包含b中的所有元素,则应抛出异常.
请注意,这与套装不同!我对找到a和b中元素集的区别不感兴趣,我对a和b中元素的实际集合之间的差异感兴趣.
我可以用for循环来做这个,在a中查找b的第一个元素,然后从a中删除元素,然后从a中删除等等.但这对我没有吸引力,它会非常低效(O(n^2)时间顺序)虽然及时做到这一点应该没问题O(n log n).
给定列表a = [1, 2, 2, 3]及其子列表b = [1, 2]找到一个以这样的方式补充b的列表sorted(a) == sorted(b + complement).在上面的例子中,complement将是一个列表[2, 3].
使用列表理解是很诱人的:
complement = [x for x in a if x not in b]
Run Code Online (Sandbox Code Playgroud)
或套装:
complement = list(set(a) - set(b))
Run Code Online (Sandbox Code Playgroud)
但是,这两种方式都会回归complement = [3].
一个显而易见的方法是:
complement = a[:]
for element in b:
complement.remove(element)
Run Code Online (Sandbox Code Playgroud)
但这感觉非常不满意,而且不是非常Pythonic.我错过了一个明显的习语还是这样?
正如下面指出的那样,性能O(n^2)是否有更有效的方法?
我想减去一个字符串列表,其中有多个相同的元素(因此设置操作没有用)。
例子:
C = ['A','B','B']
D = ['B']
Run Code Online (Sandbox Code Playgroud)
我想要一种方法来做到这一点:
C - D = ['A','B']
Run Code Online (Sandbox Code Playgroud)
到目前为止我得到的示例,但没有给出我想要的结果
[item for item in C if item not in D]
returns: ['A']
Run Code Online (Sandbox Code Playgroud)
这是一个更详细的示例来展示我想要的内容:
C = ['A','B', 'A','A','B','B','B','X','B']
D = ['A','B','B','Y']
Run Code Online (Sandbox Code Playgroud)
这就是我想要的结果:
C - D = ['A', 'A', 'B', 'B','B','X']
Run Code Online (Sandbox Code Playgroud) 我有3个列表,我想找到第1 /第2和第2 /第3之间的差异并打印它们.
这是我的代码:
n1 = [1,1,1,2,3]
n2 = [1,1,1,2] # Here the 3 is not found ("3" is not present in n1 at all)
n3 = [1,1,2] # here 1 is not found (there are fewer "1"s in n3 than in n2)
for x in n1:
if x not in n2:
print x
for m in n2:
if m not in n3:
print m
Run Code Online (Sandbox Code Playgroud)
但我得到的输出只有3.
如何使它输出1和3?我也尝试使用sets,但它只是3再次打印.
假设我有两个列表,例如:
list1 = ['a', 'c', 'a', 'b']
list2 = ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'f']
list_final = list2 - list1
list_final = ['a', 'a', 'c', 'd', 'e', 'f']
Run Code Online (Sandbox Code Playgroud)
我认为set(lists)和使用.difference 的方法不会有帮助,因为它不是一个唯一的集合。任何形式的帮助将不胜感激,我对语言不熟悉,所以欢迎任何和所有答案/提示!
我想删除 l1 中 l2 中的元素,同时保留重复项。
输入:
l1 = [a, b, b, a, c, c, a]
l2 = [c, b]
Run Code Online (Sandbox Code Playgroud)
输出:
l3 = [a, b, a, c, a]
Run Code Online (Sandbox Code Playgroud)
我试图为此找到一个很好的答案,但我似乎找到的只是这样做的方法,它也删除了重复项。首先,我尝试使用 set() 执行此操作,直到我意识到它会删除重复项,然后我尝试使用 numpy 和 setdiff1d 但无法使其正常工作。使用列表理解,如
[item for item in x if item not in y]
Run Code Online (Sandbox Code Playgroud)
还删除了重复项。从列表中删除另一个列表中的元素而不删除重复项的最简单方法是什么?列表的顺序并不重要。