我在文件中有这个列表: 阿拉巴马 4802982 9 阿拉斯加州 721523 3 亚利桑那 6412700 11 阿肯色州 2926229 6 加州 37341989 55 科罗拉多州 5044930 9
(除了每个州继续)我需要创建一个字典,其中州名作为键,人口和选举人票(第一和第二个数字)作为值列表。
到目前为止,这是我的功能:
def make_elector_dictionary(file):
dic = {}
try:
infile = open(file,'r')
except IOError:
print('file not found')
else:
for line in infile:
line = line.strip()
dic[line] = ()
print(dic)
答案 0 :(得分:1)
试试这个:
s = "Alabama 4802982 9 Alaska 721523 3 Arizona 6412700 11 Arkansas 2926229 6 California 37341989 55 Colorado 5044930 9"
l = s.split()
dictionaryYouWant = {l[index]: [l[index+1], l[index+2]] for index in range(0, len(l), 3)}
split
字符串按空格将其拆分为单词,然后遍历每三个,使一个项目成为第一个:列表最后两个字典理解。
这给出了:
{'Alabama': ['4802982', '9'], 'Alaska': ['721523', '3'], 'Arizona': ['6412700', '11'], 'Arkansas': ['2926229', '6'], 'California': ['37341989', '55'], 'Colorado': ['5044930', '9']}
答案 1 :(得分:0)
以下内容应该大致为您提供:
def make_elector_dictionary(file):
# Open and read the entire file
try:
with open(file,'r') as infile:
raw_data = infile.read()
except IOError:
print('file not found')
return
# Split the text into an array, using a space as the separator between array elements
raw_data = raw_data.split(' ')
# Rearrange the data into a dictionary of dictionaries
processed_data = {raw_data[i]: {'pop': int(raw_data[i+1]), 'electoral_votes': int(raw_data[i+2])}
for i in range(0, len(raw_data), 3) }
return processed_data
print(make_elector_dictionary('data.txt'))
这给出了:
{'Arizona': {'pop': 6412700, 'electoral_votes': 11}, 'Arkansas': {'pop': 2926229, 'electoral_votes': 6}, 'California': {'pop': 37341989, 'electoral_votes': 55}, 'Colorado': {'pop': 5044930, 'electoral_votes': 9}, 'Alabama': {'pop': 4802982, 'electoral_votes': 9}, 'Alaska': {'pop': 721523, 'electoral_votes': 3}}

或者您可以使用
processed_data = {raw_data[i]: [int(raw_data[i+1]), int(raw_data[i+2])]
for i in range(0, len(raw_data), 3) }
如果您希望字典值是数组而不是字典。此方法是否有效取决于数据文件的详细信息。例如,如果"新罕布什尔州"写在你的数据文件中,空格介于" New" " Hampshire",然后" New"将被函数解释为状态名称,并且当您尝试传递" Hampshire"时,您将获得ValueError。以人口为单位。在这种情况下,您必须使用一些更复杂的解析才能使其正常工作 - 正则表达式可能是最佳选择。你可以这样做:
processed_data = {match[1]: [match[2], match[3]]
for match in re.findall(r'(\W|^)([a-zA-z ]+)\s+(\d+)\s+(\d+)', raw_data)}
请记住import re
。这可能是最强大的方法。它将处理New Hampshire类型的情况,并且在上面的表单中,不依赖于分隔数据元素的空白类型。