从基于键的两个词典中拉出来,有时键不在python 2.7中的一个词典中

时间:2013-10-04 12:40:40

标签: python python-2.7 dictionary

我是python的新手,我正在使用python 2.7。我有两个具有相同键的字典。一本字典总是一样的。另一个可能没有第一个字典中的所有匹配键。我已根据此主题的堆栈溢出中的其他问题尝试了许多变体。

我甚至尝试使用以下代码进行测试。无效的部分是比较不同词典中的键。 样本字典:

clubDict = {'001':'Alabama','066':'MountainWest','602':'The Auto Club Group'}

data = {'001':6021, ,'066':1134}

如您所见,数据字典中没有密钥602。数据字典正在这个代码中由csv文件构建,该文件可以为总数添加多个数字。大部分代码都是在堆栈溢出中回答的。

当我没有if,elifs时,代码工作了。但是,print语句在打印时会产生不同的结果。这是对数据{}中缺少键的做法。我添加了一个if,else尝试使用pass来比较密钥。仍然不会比较。所以我试过你现在看到的东西。

这是我的代码的一部分:

def getTotals():

    result = defaultdict(int)
    regexp = re.compile(r'(?:ttp_ws_sm|ttpv1)_(\d+)_')

    with open(os.path.join(source, 'ttp_13_08.csv'), 'r') as f:
        rows = csv.reader(f)

        #adds total values for each club code (from csv file)
        for row in rows:
            match = regexp.search(row[1])
            if match:
                result[match.group(1)] += int(row[13])
        for key, value in result.items():
            data.update(result.items())

        for value, key in clubDict.items():
            #f = open(output_path + filename, 'a')
            shared_keys = set(clubDict.keys()).union(data.keys())

            if key not in data:
                print "No counts avialable"
            elif key not in clubDict:
                print "Check for Club code"
            elif data[key] == clubDict[key]:
                print 'match'#, '{0}, {1}, {2}'.format(key, value, data[value])
            else:
                print '{0}, {1}, {2}'.format(key, value, data[value])
    file.close

def main():

try:
    getTotals()
except:
    print "No more results"

结果不是我需要的。

这是预期的结果:

Alabama 001 6021

MountainWest 066 1134.

我已经回顾了堆栈溢出中的许多q / a,似乎无法获得这些结果。我可能只是在我的问题上搜索错误。

1 个答案:

答案 0 :(得分:6)

您在循环中交换了valuekey

for value, key in clubDict.items():

.items()为您提供(key, value)元组。

重新编写代码以删除冗余:

def getTotals():
    result = defaultdict(int)
    regexp = re.compile(r'(?:ttp_ws_sm|ttpv1)_(\d+)_')

    with open(os.path.join(source, 'ttp_13_08.csv'), 'r') as f:
        rows = csv.reader(f)

        #adds total values for each club code (from csv file)
        for row in rows:
            match = regexp.search(row[1])
            if match:
                result[match.group(1)] += int(row[13])
        data.update(result)

        for key in clubDict.viewkeys() & data:
            club_value, data_value = clubDict[key], data[key]
            if club_value == data_value:
                print 'match'
            else:
                print '{0}, {1}, {2}'.format(key, club_value, data_value)

您已经计算了两个词典的交集,它们只为您提供了键,但您确实需要遍历该交叉点,而不是clubDict

我使用dict.viewkeys()直接获取类似于集合的对象,它可以非常有效地与另一个可迭代的对象(如data字典)相交,而不会产生中间结果。