Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用if和循环技术将清理后的数据附加到字典中_Python_Dictionary_For Loop_If Statement - Fatal编程技术网

Python 使用if和循环技术将清理后的数据附加到字典中

Python 使用if和循环技术将清理后的数据附加到字典中,python,dictionary,for-loop,if-statement,Python,Dictionary,For Loop,If Statement,我有一个数据集要清理和组织。这是数据集的链接 所以我想做的是用{State:Town}格式清理字典中的数据集,例如{'Alabama':'Auburn',Alabama:'Florence'…'Wyoming':'Laramie') 这是我的密码: import re univ_towns = open('university_towns.txt',encoding='utf-8').readlines() state_list = [] d={} for name in univ_to

我有一个数据集要清理和组织。这是数据集的链接

所以我想做的是用{State:Town}格式清理字典中的数据集,例如{'Alabama':'Auburn',Alabama:'Florence'…'Wyoming':'Laramie')

这是我的密码:

import re

univ_towns = open('university_towns.txt',encoding='utf-8').readlines()

state_list = []
d={}

for name in univ_towns:
    if "[ed" in name:
        statename = re.sub('\[edit]\n$', '', name)
        state_list.append(statename)
        len_state = len(state_list)
    elif "(" in name:
        sep = ' ('
        townname = name.split(sep, 1)[0]
        if "," in townname:
            sep = ','
            townname = townname.split(sep, 1)[0]
        d[state_list[len_state-1]] = townname

d     
然而,我的输出代码只给出了字典中最后一个附加的结果。我确信循环逻辑有问题,但我无法真正找出问题所在。以下是我的代码输出:

{'Alabama': 'Tuskegee',
 'Alaska': 'Fairbanks',
 'Arizona': 'Tucson',
 'Arkansas': 'Searcy',
 'California': 'Whittier',
 'Colorado': 'Pueblo',
 'Connecticut': 'Willimantic',
 'Delaware': 'Newark',
 'Florida': 'Tampa',
 'Georgia': 'Young Harris',
 'Hawaii': 'Manoa',
 'Idaho': 'Rexburg',
 'Illinois': 'Peoria',
 'Indiana': 'West Lafayette',
 'Iowa': 'Waverly',
 'Kansas': 'Pittsburg',
 'Kentucky': 'Wilmore',
 'Louisiana': 'Thibodaux',
 'Maine': 'Waterville',
 'Maryland': 'Westminster',
 'Massachusetts': 'Framingham',
 'Michigan': 'Ypsilanti',
 'Minnesota': 'Winona',
 'Mississippi': 'Starkville',
 'Missouri': 'Warrensburg',
 'Montana': 'Missoula',
 'Nebraska': 'Wayne',
 'Nevada': 'Reno',
 'New Hampshire': 'Rindge',
 'New Jersey': 'West Long Branch',
 'New Mexico': 'Silver City',
 'New York': 'West Point',
 'North Carolina': 'Winston-Salem',
 'North Dakota': 'Grand Forks',
 'Ohio': 'Wilberforce',
 'Oklahoma': 'Weatherford',
 'Oregon': 'Newberg',
 'Pennsylvania': 'Williamsport',
 'Rhode Island': 'Providence',
 'South Carolina': 'Spartanburg',
 'South Dakota': 'Vermillion',
 'Tennessee': 'Sewanee',
 'Texas': 'Waco',
 'Utah': 'Ephraim',
 'Vermont': 'Northfield',
 'Virginia': 'Chesapeake',
 'Washington': 'University District',
 'West Virginia': 'West Liberty',
 'Wisconsin': 'Whitewater',
 'Wyoming': 'Laramie'}
尝试使用defaultdict:

from collections import defaultdict

d = defaultdict(list)

for name in univ_towns:
    if "[ed" in name:
        statename = re.sub('\[edit]\n$', '', name)
        state_list.append(statename)
        len_state = len(state_list)
    elif "(" in name:
        sep = ' ('
        townname = name.split(sep, 1)[0]
        if "," in townname:
            sep = ','
            townname = townname.split(sep, 1)[0]
        d[state_list[len_state-1]].append(townname)

正如你所看到的,唯一的主要区别是最后你使用了
append
而不是
=
。你以前的方式只会返回一个城市,而不是所有城市,这似乎是你想要的,除非我有误解。

你可以接受答案,因为你所问的问题得到了正确的回答。append旁边,我认为您所做的另一件关键的事情是使用'defaultdict(list)'而不是'{}',因为append对{}不起作用。只是好奇,您知道为什么吗?对,“唯一的主要区别”当然不太准确。defaultdict(list)是它自己的对象类型,类似于一个字典,但本身并不是一个。本质上,创建它的方式不同于常规字典,Python将它识别为不同类型的对象,可以添加不同的项,但结果对象的行为与常规字典一样。它非常适合类似的情况当你需要创建一个列表字典时,你的。