列表/词典结构问题

时间:2017-05-06 23:55:45

标签: python data-structures

我对如何构建我需要的列表/词典感到困惑。我已经从ESPN中删除了三条信息:会议,团队和链接到团队主页,以便进行未来的统计报废。

当程序第一次运行时,id喜欢建立一个字典/列表,以便人们可以输入学校,它会打印学校所在的会议,或者可以选择整个会议,它会打印相应的列表学校。与每所学校相关的链接并不是最终用户所知道的重要,但重要的是正确的学校与正确的学校相关联,以便可以删除该特定学校的未来统计数据。

例如,报废的信息是:

SEC,UGA,www.linka.com ACC,FSU,www.linkb.com 等...

我知道我可以创建一个词典列表,如:

sec_list=[{UGA: www.linka.com, Alabama: www.linkc.com, etc...}]
acc_list=[{FSU: www.linkb.com, etc...}]

问题是id必须在这里创建大约26个列表来举行每个听起来过多的会议。有没有办法将所有内容整合到一个列表中,但仍然有能力从特定会议中提取学校或搜索学校,还会返回正确的会议?当然,学校的链接也必须与正确的学校相对应。

2 个答案:

答案 0 :(得分:2)

Python附带sqlite3来处理数据库问题,它具有内存数据库的:memory:模式。我认为它将直接解决您的问题并使用清晰的代码。

import sqlite3
from pprint import pprint

# Load the data from a list of tuples in the from [(conf, school, link), ...]
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('CREATE TABLE Espn (conf text, school text, link text)')
c.execute('CREATE INDEX Cndx ON Espn (conf)')
c.execute('CREATE INDEX Sndx ON Espn (school)')
c.executemany('INSERT INTO Espn VALUES (?, ?, ?)', data)
conn.commit()

# Run queries 
pprint(c.execute('SELECT * FROM Espn WHERE conf = "Big10"').fetchall())
pprint(c.execute('SELECT * FROM Espn WHERE school = "Alabama"').fetchall())

在内存数据库中,创建和查询非常容易,它们通常是解决如何拥有多个查找键和对关系数据进行分析的最简单的解决方案。尝试使用dicts和list进行此类工作只会使问题变得不必要地复杂化。

答案 1 :(得分:1)

您可以使用词典列表执行此操作,但您可能会发现使用命名字段查找信息更容易。在这种情况下,我建议将已删除的数据存储在Pandas DataFrame中。

你想要它,以便“一个人可以在学校打字,它会打印学校所在的会议,或者可以选择整个会议,并打印相应的学校列表”。

以下是使用Pandas和一些便利功能的示例。

首先,一些示例数据:

confs = ['ACC','Big10','BigEast','BigSouth','SEC',
         'ACC','Big10','BigEast','BigSouth','SEC']
teams = ['school{}'.format(x) for x in range(10)]
links = ['www.{}.com'.format(x) for x in range(10)]
scrape = zip(confs,teams,links)

[('ACC', 'school0', 'www.0.com'),
 ('Big10', 'school1', 'www.1.com'),
 ('BigEast', 'school2', 'www.2.com'),
 ('BigSouth', 'school3', 'www.3.com'),
 ('SEC', 'school4', 'www.4.com'),
 ('ACC', 'school5', 'www.5.com'),
 ('Big10', 'school6', 'www.6.com'),
 ('BigEast', 'school7', 'www.7.com'),
 ('BigSouth', 'school8', 'www.8.com'),
 ('SEC', 'school9', 'www.9.com')]

现在转换为DataFrame

import pandas as pd
df = pd.DataFrame.from_records(scrape, columns=['conf','school','link'])

       conf   school       link
0       ACC  school0  www.0.com
1     Big10  school1  www.1.com
2   BigEast  school2  www.2.com
3  BigSouth  school3  www.3.com
4       SEC  school4  www.4.com
5       ACC  school5  www.5.com
6     Big10  school6  www.6.com
7   BigEast  school7  www.7.com
8  BigSouth  school8  www.8.com
9       SEC  school9  www.9.com

输入学校,参加会议:

def get_conf(df, school):
    return df.loc[df.school==school, 'conf'].values

get_conf(df, school = 'school1')
['Big10']

输入会议,获得学校:

def get_schools(df, conf):
    return df.loc[df.conf==conf, 'school'].values

get_schools(df, conf = 'Big10')
['school1' 'school6']

从您的问题中不清楚您是否还希望在通过会议搜索时返回与学校相关联的链接。如果是,请将get_schools()更新为:

def get_schools(df, conf):
    return df.loc[df.conf==conf, ['school','link']].values