我有一个要在我的Python程序中使用的CSV字典dictionary.txt。我已经使用标准库csv打开文档。这些是用户输入以选择难度的难度级别。如果用户选择“ EASY”,则我希望能够忽略标题,并能够获得“ EASY”标题下的元素数量,直到下一个难度之前。标头前面的数字是难度。我在这些标题之间有标题和数据,类似于:
1, ##### EASY #####
key1, value1
key2, value2
2, ##### MEDIUM #####
key3, value3
key4, value4
3, ##### HARD #####
key5, value5
key6, value6
我想为每个部分返回字典类型的有用元素的字典类型(只是键n,值n),还有一个“ ALL”选项。我当前的代码看起来像这样,但是我不知道从这里做什么:
with open("PLUG_dict.txt", "r") as db:
mydict = dict(csv.reader(db))
for key in mydict.keys():
if len(key) == 1:
sections.append(mydict[key])
我如何:
答案 0 :(得分:0)
在代码中,将文件内容转换为字典时,由于dict
是无序的,因此您将失去顺序:
>>> dict(csv.reader(db))
{
'1': ' ##### EASY #####',
'3': ' ##### HARD #####',
'2': ' ##### MEDIUM #####',
'key3': ' value3',
'key2': ' value2',
'key1': ' value1',
'key6': ' value6',
'key5': ' value5',
'key4': ' value4'
}
例如,您可以迭代csv.reader(f)
返回的内容以完全映射文件中的内容:
mydict = {}
with open("PLUG_dict.txt", "r") as db:
for key, val in csv.reader(db):
if len(key) == 1:
# Difficulty line
dif = key
# Construct the entry for this difficulty, and save its name
mydict[dif] = { 'name' : val }
else:
# key, val line
# Simply add it in the dict of the current difficulty
mydict[dif][key] = val
如果文件的第一行不是“难度行” ,则此方法将无效。
这将构造以下mydict
{
'1': {
'name': ' ##### EASY #####',
'key1': ' value1',
'key2': ' value2'
},
'3': {
'name': ' ##### HARD #####',
'key5': ' value5',
'key6': ' value6'
},
'2': {
'key3': ' value3',
'name': ' ##### MEDIUM #####',
'key4': ' value4'
}
}
您确实可以更改处理'name'
的方式。
然后,使用dif = '1'
,您可以:
查找指定难度的值:
mydict[dif]
将返回
{
'name': ' ##### EASY #####',
'key1': ' value1',
'key2': ' value2'
}
查找困难下的元素数量:
len(mydict[dif]) - 1
将返回
2
在这里,- 1
对于从计数中删除'name'
是必要的。根据您处理'name'
的方式,可以将其丢弃。
返回字典中所有难度下的所有元素:
{
key: val
for elements in mydict.values()
for key, val in elements.items()
if key != 'name'
}
将返回
{
'key3': ' value3',
'key2': ' value2',
'key1': ' value1',
'key6': ' value6',
'key5': ' value5',
'key4': ' value4'
}
此外,根据您处理'name'
的方式,条件if key != 'name'
可以省略。
我不确定是否了解有关HARD
错误的问题吗?
希望对您有帮助!
答案 1 :(得分:0)
您可以按照以下方式进行操作:
import csv
with open('dictionary.txt', 'r') as f:
data={}
k=None
for row in csv.reader(f):
print row
if row[1] in ' ##### EASY ##### ##### MEDIUM ##### ##### HARD #####':
k=row[1].strip()
data[k]={}
elif k:
data[k][row[0]]=row[1]
产生:
>>> data
{'##### HARD #####': {'key6': ' value6', 'key5': ' value5'}, '##### EASY #####': {'key2': ' value2', 'key1': ' value1'}, '##### MEDIUM #####': {'key3': ' value3', 'key4': ' value4'}}
然后通过data[category][key_you_want_in_category]
答案 2 :(得分:0)
请使用Python的数据类型比csv更合适
改为使用plugin_dict.py并将其放入
levels = {'EASY': ["value 1", "value 2"],
'MEDIUM': ["value 3", "value 4"],
'HARD': ["value 5", "value 5"]
}
然后做:
from plug_dict.py import levels
SECTIONS = []
#index of a particular line
Unnecessary, get the values instead
values_of_sect = levels['HARD']
# THE DIFFICULTIES
for key in levels:
SECTIONS.append(key)
# no of elements in between difficulties
# do
elements = len(levels['HARD'])
# Handle the 'HARD' difficulty
unnecessary, python types handles it beautifully, you will get no errors