2017-05-06 64 views
1

我很困惑如何构建我需要的列表/字典。我已经从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...}] 

问题是编号必须在这里创建约26个列表来举行每个会议听起来过多。是否有办法将所有内容都归入一个列表,但是仍然能够从特定会议中提取学校或搜索学校,并返回正确的会议?当然,与学校的联系也必须与正确的学校相对应。

+0

听起来像是你想要一本字典'{'SEC':[{'UGA':'www.linka.com','Alabama':'www.linkc.com'等等}},'ACC ':[{'FSU':'www.linkb.com',等...}],...}' –

+0

抱歉关于编辑。在某个iPad上打字可能会造成某些问题。 – Biggen

+0

实际上,这听起来像是您想要一个数据库。尝试sqlite。 – Harvey

回答

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()) 

内存数据库是那么容易创建和查询,他们往往对如何有多个查找键和关系数据做分析这个问题最简单的解决方案。试图使用这些工作的词典和列表只会让问题变得不必要的复杂。

+1

我不确定为什么我几个月前还没有考虑使用sqllite,因为我在另一个项目中使用了它,并且很享受使用它。我非常关心如何使用列表/字典来解决我的问题,因为我无法“看到树木的森林”,并考虑其他方法。 – Biggen

1

确实,您可以使用字典列表来做到这一点,但是您可能会发现使用命名字段查找信息更容易。在这种情况下,我建议将您的刮取数据存储在Pandas DataFrame中。

你希望这样做:“人们可以在学校打字,打印学校所在的会议,或者可以选择整个会议并打印相应的学校名单”。

下面是使用熊猫和一些便利功能的例子。

首先,一些示例数据:

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 
+0

这是有希望的。我还没有使用熊猫,但今天早些时候我开始看一个教程。我可能会玩这个方法来学习熊猫。感谢您深思熟虑的帖子! – Biggen