在python

时间:2015-11-04 22:55:41

标签: python data-structures

我有一些我想要存储的基本数据,而且我正在寻找一个更好的解决方案,而不是我想出的。 我有多个数据条目,每个条目有4个字段,name,url,currYear,availYears

我可以用一个简单的数组来解决这个问题:

data = [
    ['test-name', ['http://example.com', '2015', '2015,2014']]
    ['next-name', ['http://example.org', '1999', '1999']]
]

但是当尝试访问每个数组中的数据时,这会变得混乱。我最终得到了像这样的for循环

for each in data:
    name = each[0]
    url = each[1][0]
    currYear = each[1][1]

我更喜欢做类似dict的事情,我可以通过一个关键名称引用我想要的东西。这不是有效的语法,但希望它能得到重点。

data = {'entry1': {'name': 'test-name'}, {'url': 'http://example.com'}, {'currYear': '2015'}, {'availYears': '2015,2014'}}

然后我可以为entryX提取网址数据。

编辑: 几个好的回应。我决定创建一个类,因为1)它满足了我的需要2)通过隔离功能帮助清理代码3)了解包,模块和类与Java相比如何工作(我更熟悉) 。 除了创建类之外,我还创建了getter和setter。

class SchoolSiteData(object):
    def __init__(self, name, url, currYear, availYears):
        self.name = name
        self.url = url
        self.currYear = currYear
        self.availYears = availYears

    def getName(self):
        return self.name
    def getURL(self):
        return self.url
    def getCurrYear(self):
        return self.currYear
    def getAvailYears(self):
        return self.availYears

    def setName(self, name):
        self.name = name
    def setURL(self, url):
        self.url = url
    def setCurrYear(self, currYear):
        self.currYear = currYear
    def setAvailYears(self, availYears):
        self.availYears = availYears

5 个答案:

答案 0 :(得分:3)

使用名称作为字典中的键:

data = {'test-name': 
           {'url': 'http://example.com', 
            'currYear': '2015', 
            'availYears': '2015,2014'
           }
       }

如此访问:

data['test-data']['url']

答案 1 :(得分:3)

一个类可以使这更容易使用:例如:

    class Entry(object):
        def __init__(self, name, url, currYear, availYears):
            self.name = name
            self.url = url
            self.currYear = currYear
            self.availYears = availYears

    entry1 = Entry('test-name', 'http://example.com', '2015', '2015,2014')
    entry2 = Entry('next-name', 'http://example.org', '1999', '1999')

    data = [entry1, entry2]

    for entry in data:
        print entry.name
        print entry.url 
        print entry.currYear 
        print entry.availYears
        print

答案 2 :(得分:2)

您似乎使用list-in-list解决方案进行了不必要的复杂处理。如果你保持平衡,你可以将行解压缩成变量:

data = [
    ['test-name', 'http://example.com', '2015', '2015,2014'],
    ['next-name', 'http://example.org', '1999', '1999']
]

for name, url, currYear, availYears in data:
    ....

答案 3 :(得分:1)

您想要的最轻量级解决方案可能是namedtuple

>>> from collections import namedtuple
>>> mytuple = namedtuple("mytuple", field_names="url currYear availYears")
>>> data = [ 'test-name': mytuple('http://example.com', '2015', '2015,2014'), ...
    ... ]
>>> print(data['test-name'])
mytuple(url='http://example.com', currYear='2015', availYears='2015,2014')

您可以通过数字索引或名称访问成员:

>>> x = data['test-name']
>>> print(x.currYear)
2015
>>> print(x[1])
2015

答案 4 :(得分:0)

data = [
    {'name': 'test-name', 'url': 'http://example.com', 'currYear': '2015', 'availYears': '2015,2014'},
    {'name': 'next-name', 'url': 'http://example.org', 'currYear': '1999', 'availYears': '1999'}
]
for each in data:
    name = each['name']
    url = each['url']
    currYear = each['currYear']