如何找到检查键值对的两个词典列表之间的区别

时间:2015-06-18 01:12:45

标签: python list csv dictionary

我已经搜索过我的问题的解决方案,但没有成功。我的问题的部分解决方案是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': ''}"

3 个答案:

答案 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代替列表理解。