根据键从两个词典中提取,有时键不是';python 2.7中的一个字典中的t

根据键从两个词典中提取,有时键不是';python 2.7中的一个字典中的t,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我是python新手,正在使用python 2.7。我有两本钥匙相同的字典。一本字典总是一样的。另一个可能没有第一个字典中的所有匹配键。在这个主题上,我尝试了基于Stack overflow中其他问题的许多变体 我甚至尝试过使用以下代码进行测试。不起作用的部分是比较不同字典中的键。 样本记录: clubDict = {'001':'Alabama','066':'MountainWest','602':'The Auto Club Group'} data = {'001':6021, ,'0

我是python新手,正在使用python 2.7。我有两本钥匙相同的字典。一本字典总是一样的。另一个可能没有第一个字典中的所有匹配键。在这个主题上,我尝试了基于Stack overflow中其他问题的许多变体

我甚至尝试过使用以下代码进行测试。不起作用的部分是比较不同字典中的键。 样本记录:

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

data = {'001':6021, ,'066':1134}
如您所见,数据字典中没有键602。此代码中的数据dict是从一个csv文件中生成的,该文件总共添加了多个数字。这段代码的大部分在堆栈溢出中得到了回答

当我没有if,elifs时,代码就工作了。然而,打印语句在打印时会给出不同的结果。这是对数据{}中缺少键的处理方法。我添加了一个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,但似乎无法得到这些结果。我可能只是错误地搜索了我的问题。

您交换了循环中的
值和
键:

for value, key in clubDict.items():
.items()
提供
(键、值)
元组

稍微修改代码以删除冗余:

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


我曾经直接得到一个类似集合的对象,它可以与另一个iterable相交,比如
数据
字典,非常有效,没有中间结果。

您正在循环
result.items()
然后每次调用
.update()
result.items()
,忽略
。整个循环可以替换为一个
data.update(result)
call.Brilliant。那很好用。我在这上面花了很多时间。