我已经搜索过我的问题的解决方案,但没有成功。我的问题的部分解决方案是here,但这并不能解决所有问题。
我有两个这样的字典列表 - 每个字典都写入csv文件,但我将内容读入以下变量:
list1 = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]
list2 = [{b:2, a:1, c:3}, {c:6, b:5, a:4}, {b:8, a:7, c:9}]
使用上述链接的解决方案,即:
>>> import itertools
>>> a = [{'a': '1'}, {'c': '2'}]
>>> b = [{'a': '1'}, {'b': '2'}]
>>> intersec = [item for item in a if item in b]
>>> sym_diff = [item for item in itertools.chain(a,b) if item not in intersec]
我没有匹配,因为字典的顺序不同。但事实上,两个名单都是一样的。我怎么检查这个?在将字典写入csv文件之前,是否必须对字典进行排序?这可以解决吗?
这是我目前的主要问题,但我还有另一个问题。能够进行匹配检查但忽略我定义的一个或多个键会很棒。这也可能吗?
编辑:我在csv文件中有dicitonaries并且我使用以下代码阅读它们:
def read_csv_file(self, filename):
'''Read CSV file and return its content as a Python list.'''
f = open(filename, 'r')
csvfile = csv.reader(f)
f.close
return [row for row in csvfile]
这一点非常重要,因为我认为问题在于,从csv读取值后,它不再是字典了,所以顺序必须相同。
EDIT2:csv文件的示例(3行,它创建一个空行,但这不是问题......)
"{u'Deletion': '0', u'Source': 'Not Applicable', u'Status': ''}"
"{u'Deletion': '0', u'Source': 'Not Applicable', u'Status': ''}"
答案 0 :(得分:0)
您需要仔细检查您的代码。我没有得到你提出的问题。
list1 = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]
list2 = [{b:2, a:1, c:3}, {c:6, b:5, a:4}, {b:8, a:7, c:9}]
list1 = [{'a':1, 'b':2, 'c':3}, {'a':4, 'b':5, 'c':7}, {'a':7, 'b':8, 'c':9}]
list2 = [{'b':2, 'a':1, 'c':3}, {'c':6, 'b':2, 'a':4}, {'b':8, 'a':7, 'c':9}]
intersec = [item for item in list1 if item in list2]
sym_diff = [item for item in itertools.chain(list1,list2) if item not in intersec]
print(intersec)
print(sym_diff)
>>>[{'a': 1, 'c': 3, 'b': 2}, {'a': 4, 'c': 6, 'b': 5}, {'a': 7, 'c': 9, 'b': 8}]
>>>>[]
如果我更改list1和list 2(中间词典):
list1 = [{'a':1, 'b':2, 'c':3}, {'a':7, 'b':5, 'c':2}, {'a':7, 'b':8, 'c':9}]
list2 = [{'b':2, 'a':1, 'c':3}, {'c':6, 'b':5, 'a':4}, {'b':8, 'a':7, 'c':9}]
运行相同的代码:
[{'a': 1, 'c': 3, 'b': 2}, {'a': 7, 'c': 9, 'b': 8}]
[{'a': 7, 'c': 2, 'b': 5}, {'a': 4, 'c': 6, 'b': 5}]
链接中提供的代码似乎工作正常。字典或列表的顺序在python中无关紧要。
答案 1 :(得分:0)
根据我们上次的CHAT对话,OP找到了部分解决方案,它是使用ast模块将字符串转换为字典。
现在使用此模块转换csv.reader()
读取的每一行,因为它返回一个字符串列表,如果是OP的CVS文件,它将是一个字符串的列表,然后将此字典附加到列表中。之后使用itertools.chain
列表理解,我们可以得到两个列表之间的区别。
import csv
import ast
import itertools
def csvToList(myCSVFile):
'''This function is used to convert strings returned by csv.reader() into List of dictionaries'''
f = open(myCSVFile, 'r')
l = []
try:
reader = csv.reader(f)
for row in reader:
if row: #as you mentioned in your 2nd edit that you could have empty rows.
l.append(ast.literal_eval(row[0]))
finally:
f.close()
return l
list1 = csvToList('myCSV1.csv')
list2 = csvToList('myCSV2.csv')
l1_sub_l2 = [d for d in list1 if d not in list2]
l2_sub_l1 = [d for d in list2 if d not in list1]
list_difference = list(itertools.chain(l1_sub_l2, l2_sub_l1))
答案 2 :(得分:-1)
在回程中使用dictionary comprehension代替列表理解。