我刚刚开始使用Python并且有点困惑。我理解字典的基本思想是(键,值)。我正在编写一个程序,想要读入一个文件,在字典中讲故事,然后通过引用值来完成不同的功能。我不确定我是否应该使用字典或列表。该文件的基本布局是: 名称后跟12个不同年份,例如: A 12 12 01 11 0 0 2 3 4 9 12 9
我不确定阅读此信息的最佳方式是什么。我以为如果我的名字后跟年份,字典可能会有所帮助,但我不确定我是否可以将12年映射到一个关键名称。我真的很困惑如何做到这一点。我可以逐行读取文件,但不能在字典中读取。
def readInFile():
fileDict ={"Name ": "Years"}
with open("names.txt", "r") as f:
_ = next(f)
for line in f:
if line[1] in fileDict:
fileDict[line[0]].append(line[1])
else:
fileDict[line[0]] = [line[1]]
我对这段代码的想法是每年追加价值。 如果您有任何建议,请告诉我。
谢谢!
答案 0 :(得分:1)
你可以在一行中完成:)
print({line[0]:line[1:].split() for line in open('file.txt','r') if line[0]!='\n'})
输出:
{'A': ['12', '12', '01', '11', '0', '0', '2', '3', '4', '9', '12', '9']}
以上词汇理解与:
相同dict_1={}
for line in open('legend.txt', 'r'):
if line[0]!='\n':
dict_1[line[0]]=line[1:].split()
print(dict_1)
答案 1 :(得分:0)
您可以将12年映射到一个键名称。你似乎认为你需要在字典和列表之间进行选择(“我不确定我是否应该使用字典或列表。”)但这些不是替代品。你的12年可以有用地表示为一个列表。你的名字可以是字典键。因此,您需要(如PM 2Ring建议的那样)一个字典,其中键是一个名称,而值是一个年份列表。
def readInFile():
fileDict = {}
with open(r"names.txt", "r") as f:
for line in f:
name, years = line.split(" ",1)
fileDict[name] = years.split()
对字符串方法split()
进行两次调用。第一个将名称与第一个空间的年份分开。 (您可以使用line[0]
获取名称,但前提是该名称长度为一个字符,并且对于实际数据不太可能有用。)第二次调用split()
选择相隔年份并放置他们在一个列表中。
单行示例文件的结果与运行此文件的结果相同:
fileDict = {'A': ['12', '12', '01', '11', '0', '0', '2', '3', '4', '9', '12', '9']}
正如您所看到的,这些年是字符串而不是整数:您可能想要转换它们。
而不是:
_ = next(f)
扔掉你的记录数,考虑做
for line in f:
if line.strip().isdigit():
continue
代替。如果您使用file
的内置迭代(for line in f
),那么通常最好不要自己在next()
上致电f
。
我也不清楚为什么你的代码会这样做:
fileDict ={"Name ": "Years"}
这是对您计划放入字典的内容的描述,但这不是字典的工作方式。它们不是具有命名列的数据库表。如果您使用带有键的字典: name 和值:年份列表,则该结构为隐式。您可以做的最好的事情是在注释或类型注释中描述它。执行分配将导致:
fileDict = {
'A': ['12', '12', '01', '11', '0', '0', '2', '3', '4', '9', '12', '9'],
'Name ': 'Years'
}
混合了描述和数据,可能不是你想要的,因为你的后续代码可能期望在字典值中有12个年份列表,如果是这样,它会阻塞字符串{{1} }。