Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从列表中减去列表?_Python_List - Fatal编程技术网

Python 如何从列表中减去列表?

Python 如何从列表中减去列表?,python,list,Python,List,我正在尝试制作一个从列表中减去列表的代码 例如: list1 = ['hi', 'hi', 'once', 'twice'] list2 = ['hi', 'once', 'twice'] 减去我想要的列表的结果是: differenceoflists = ['hi'] 目前,我正在使用代码 list1 = ['hi', 'hi', 'once', 'twice'] list2 = ['hi', 'once', 'twice'] differenceoflists = [] for i in

我正在尝试制作一个从列表中减去列表的代码

例如:

list1 = ['hi', 'hi', 'once', 'twice']
list2 = ['hi', 'once', 'twice']
减去我想要的列表的结果是:

differenceoflists = ['hi']
目前,我正在使用代码

list1 = ['hi', 'hi', 'once', 'twice']
list2 = ['hi', 'once', 'twice']
differenceoflists = []
for i in list1:
    if i not in list2:
        differenceoflists.append(i)
print(differenceoflists)

然而,这段代码并没有按我所希望的方式运行。当我希望它返回
['hi']
时,它返回一个空列表。如何正确执行此操作?

您的代码工作不正常,因为它无法跟踪使用
列表2
中的项目丢弃
列表1
中相应项目的频率

您可以从
list1
的副本开始并从
list2
中删除所有项目,而不是通过添加项目来构建
差异列表。这样,对应的项目对只匹配一次,如果项目在
list1
中的包含频率高于在
list2
中的包含频率,则额外的项目将保留

要从列表中删除项目,可以使用
remove
方法。当您试图删除的项目不在列表中时,您需要处理这种情况(只需忽略它)

将此代码与中显示的代码进行比较时,结果中包含项的顺序存在一些细微的差异。根据您的具体需要,您需要选择其中之一

differenceoflists
从左侧删除项目,而
differenceoflists\u jab
从右侧删除项目:

>>> differenceoflists([1, 3, 5, 1], [5, 1])
[3, 1]
>>> differenceoflists([1, 3, 5, 1], [1, 5])
[3, 1]
>>> differenceoflists_jab([1, 3, 5, 1], [5, 1])
[1, 3]
>>> differenceoflists_jab([1, 3, 5, 1], [1, 5])
[1, 3]
differenceoflists\u jab
不保留列表1中项目的顺序:

>>> differenceoflists([1, 3, 5, 1], [5])
[1, 3, 1]
>>> differenceoflists_jab([1, 3, 5, 1], [5])
[1, 1, 3]

这也可以使用
集合来完成。Counter
您可以将计数器彼此相减,然后将结果转换为一个列表:

from collections import Counter

list1 = ['hi', 'hi', 'once', 'twice']
list2 = ['hi', 'once', 'twice']

difference_of_lists = list((Counter(list1) - Counter(list2)).elements())

print(difference_of_lists)


但是
'hi'
列表2中,所以它不能在
差异列表中。为什么会这样?列表1中有两个hi,而列表2中只有一个hi,所以我想让代码计算列表1中多余的hi。它返回一个空列表,因为
list2
中相同的“
hi”
被匹配了两次。根据您的性能和输出限制,您可能可以使用您的想法,但不需要删除列表2的副本,并使用
从列表2中删除内容。当您将内容添加到
差异列表中时,请删除(项)
。谢谢!如果您没有使用“try”功能,它会工作吗?不,如果
list2
中有一项不在
list1
中,尝试删除它将引发
ValueError
异常。这很有意义,谢谢!您可以调用
计数器
对象的方法将其转换为列表,而不是用生成器表达式重新创建控制盘。
from collections import Counter

list1 = ['hi', 'hi', 'once', 'twice']
list2 = ['hi', 'once', 'twice']

difference_of_lists = list((Counter(list1) - Counter(list2)).elements())

print(difference_of_lists)
['hi']