首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python CSV解析字典和元素索引的查找

Python CSV解析字典和元素索引的查找
EN

Stack Overflow用户
提问于 2018-07-13 05:26:07
回答 3查看 57关注 0票数 0

我有一个CSV字典dictionary.txt,我想在我的Python程序中使用它。我已经使用标准库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])

我该如何:

  • 查找指定难度(开始和结束)的行的索引?
  • 查找最后一个难度之间的元素数,"HARD",这样运行到字典末尾就不会成为错误?
  • 如果我想包括一个分类,“difficulties?
  • Handle”,它只返回字典中所有有用的元素,该怎么做?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-13 06:11:28

在您的代码中,当您将文件内容转换为字典时,您将丢失顺序,因为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',您可以:

  • 查找指定难度的值:

我的口令

将会返回

{ 'name':‘##### EASY #’,'key1':‘value1','key2':’value2‘}

  • 查找难度下的元素个数:

len(mydictdif) -1

将会返回

2

在这里,- 1是从计数中删除'name'所必需的。根据您处理'name'的方式,它可以对字典中每个困难下的所有元素执行discarded.

  • Return操作:

{ key:对于key,mydict.values()中元素的val,如果key != 'name‘,则在elements.items()中使用val。}

将会返回

{ 'key3':‘value3','key2':’value2','key1':‘value1','key6':’value6','key5':‘value5','key4':’value4‘}

另外,根据您处理错误的方式,条件if key != 'name'可以省略。

  • 我不确定是否理解关于HARD错误的问题?

我希望它能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2018-07-13 06:29:27

你可以按照下面的思路做一些事情:

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]进行访问

票数 0
EN

Stack Overflow用户

发布于 2018-07-13 06:44:23

请注意,Python的数据类型比csv更适合这种情况

改为使用plug_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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51314701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档