Python:使用字典键值对中的值替换值

问题描述:

现在我已经在这上面花费了几个小时。我试图将1-30的犯罪号码替换为相应的犯罪类型,即偷窃,盗用,盗窃等,然后将其列入清单。Python:使用字典键值对中的值替换值

这里是输出我现在有一个样本:

进攻#:受害者总数

1 189 
10 712 
11 1844 
12 184 
13 147 
14 4364 
15 595 
16 175 
17 387 
18 2893 
2 597 
20 661 

这里是代码我迄今。我想用这个字典来替换输出中的1-30到违规类型。然后按降序从最大的受害者人数(右列)到最小值对列表进行排序。我正在处理大约100,000行数据,因此效率对此程序很重要。

from collections import Counter 

incidents_f = open('incidents.csv', mode = "r") 

crime_dict = dict() 

for line in incidents_f: 
    line_1st = line.strip().split(",") 
    if line_1st[0].upper() != "REPORT_NO": 
     report_no = line_1st[0] 
     offense = line_1st[3] 
     zip_code = line_1st[4] 
     if len(zip_code) < 5: 
      zip_code = "99999" 

     if report_no in crime_dict: 
      crime_dict[report_no].append(zip_code).append(offense) 
     else: 
      crime_dict[report_no] = [zip_code]+[offense] 

#close File 
incidents_f.close 

details_f = open('details.csv',mode = 'r') 
for line in details_f: 
    line_1st = line.strip().split(",") 
    if line_1st[0].upper() != "REPORT_NO": 
     report_no = line_1st[0] 
     involvement = line_1st[1] 
     if involvement.upper() != 'VIC': 
      continue 

     else: 
      crime_dict[report_no].append(involvement.upper()) 



#close File 
details_f.close 


offense_map = {'1':'Homicide','2':'Rape','3':'Robbery','4':'Assault','5':'Burglary','6':'Stealing','7':'Auto Theft','8':'Non Agg Assault','9':'Arson','10':'Forgery','11':'Fraud','12':'Embezzlement','13':'Stolen Property','14':'Property Damage','15':'Weapons Law Violation','16':'Prostitution','17':'Sex Offense Other','18':'Possession/Sale/Dist','20':'Family Offense','21':'DUI','22':'Liquor Law Violation','24':'Disorderly','25':'Loitering','26':'Misc Violation','29':'Missing/Runaway','30':'Casualty/Suicide'} 

victims_by_offense = {} 
for k, v in crime_dict.items(): 
    zip = v[1] 
    if zip not in victims_by_offense.keys(): 
     victims_by_offense[zip] = 0 
    victims_by_offense[zip] += v[0:].count('VIC') 

for zip in sorted(victims_by_offense.keys()): 
    print(zip, victims_by_offense[zip]) 
+0

'crime_dict [report_no] .append(ZIP_CODE).append(进攻)'应该总是给你一个AttributeError,因为'list.append'回报'None'(所以'crime_dict [report_no] .append(ZIP_CODE )'永远都是'没有') –

要获取密钥列表中victims_by_offense降序受害者总数的顺序:

victims_by_offense = {'1': 189, '10': 712, '11': 1844, '12': 184, '13': 147, '14': 4364, '15': 595, '16': 175, '17': 387, '18': 2893, '2': 597, '20': 661} 
sorted_keys = sorted(victims_by_offense, key=victims_by_offense.get, reverse=True) 

然后

for zip in sorted_keys: 
    print(offense_map[zip], victims_by_offense[zip]) 

我得到

('Property Damage', 4364) 
('Possession/Sale/Dist', 2893) 
('Fraud', 1844) 
('Forgery', 712) 
('Family Offense', 661) 
('Rape', 597) 
('Weapons Law Violation', 595) 
('Sex Offense Other', 387) 
('Homicide', 189) 
('Embezzlement', 184) 
('Prostitution', 175) 
('Stolen Property', 147) 
('Homicide', 189) 
('Embezzlement', 184) 
('Prostitution', 175) 
('Stolen Property', 147) 
+0

谢谢你。它确切地说明了我是如何需要它的。当你尝试3-4个小时,解决方案最终成为两行代码时,这是令人沮丧的。谢谢您的帮助! – Wakedude

+0

非常欢迎。感谢您发布该问题。我在工作中学到的知识将对我有所帮助。 为了给应得分,我用[简单如:sorted(dict1,key = dict1.get)](http://stackoverflow.com/a/3177911/1836587)。 – user1836587

我调整你的代码有点用csv.reader个对象而不是自己剥离和拆分,以及改变你的数据结构是

crimes = {report_no: {'offense': offense_number, 
         'zip': zip_code, 
         'victims': victim_count}, 
      ...} 

,但我认为它的效果要好得多这种方式。

import csv 
import itemgetter 

crimes = dict() 

# build `crimes` dict with zero-count victims 
with open("incidents.csv") as f: 
    reader = csv.reader(f) 
    headers = next(reader) 
    for report_no, _, _, offense, zip_code, *_ in reader: 
     if len(zip_code) < 5: 
      zip_code = "99999" 
     report = (zip_code, offense) 
     crimes[report_no] = {'offense': offense, 
          'zip': zip_code, 
          'victims': 0} 

# parse victims information 
with open("details.csv") as f: 
    reader = csv.reader(f) 
    headers = next(reader) 
    for report_no, involvement, *_ in reader: 
     if involvement.upper() == "VIC": 
      crimes[report_no]['victims'] += 1 

offense_map = {'1':'Homicide', 
       '2':'Rape', 
       '3':'Robbery', 
       '4':'Assault', 
       '5':'Burglary', 
       '6':'Stealing', 
       '7':'Auto Theft', 
       '8':'Non Agg Assault', 
       '9':'Arson', 
       '10':'Forgery', 
       '11':'Fraud', 
       '12':'Embezzlement', 
       '13':'Stolen Property', 
       '14':'Property Damage', 
       '15':'Weapons Law Violation', 
       '16':'Prostitution', 
       '17':'Sex Offense Other', 
       '18':'Possession/Sale/Dist', 
       '20':'Family Offense', 
       '21':'DUI', 
       '22':'Liquor Law Violation', 
       '24':'Disorderly', 
       '25':'Loitering', 
       '26':'Misc Violation', 
       '29':'Missing/Runaway', 
       '30':'Casualty/Suicide'} 

counts = {k: 0 for k in offense_map.values()} 
# start counting crimes by victim count (by name, not number) 

for crime_info in crimes.values() 
    try: 
     offense_no = crime_info['offense'] 
     offense_name = offense_map[offense_no] 
     counts[offense_name] += crime_info['victims'] 
    except KeyError: 
     # we couldn't map that 
     print("No such offense: {}".format(crime_info['offense'])) 

# sort by value 
for k,v in sorted(counts.items(), key=operator.itemgetter(1), reverse=True): 
    print(k, v)