在二维字典中按两个字段对python对象分组
我有一个python类在二维字典中按两个字段对python对象分组,python,list,dictionary,reference,grouping,Python,List,Dictionary,Reference,Grouping,我有一个python类剧集,它有两个字段:季节和数字。我在剧集列表中有一个对象列表。这张单子是按季节排列的,然后是按情节排列的。在下面的示例中,数据是按此顺序创建的。 我想做的是:我想创建一个seasure对象的字典。每个季节对象也有一个字典作为名为剧集的字段。本词典应包含所有具有本季编号的插曲对象。 在下面的最小示例的末尾,我打印了分组数据,结果是: S3E1 S3E2 S3E3 S3E1 S3E2 S3E3 S3E1 S3E2 S3E3 # required classes class Ep
剧集
,它有两个字段:季节
和数字
。我在剧集列表
中有一个对象列表。这张单子是按季节排列的,然后是按情节排列的。在下面的示例中,数据是按此顺序创建的。
我想做的是:我想创建一个seasure
对象的字典。每个季节
对象也有一个字典作为名为剧集
的字段。本词典应包含所有具有本季编号的插曲
对象。
在下面的最小示例的末尾,我打印了分组数据,结果是:
S3E1S3E2
S3E3
S3E1
S3E2
S3E3
S3E1
S3E2
S3E3
# required classes
class Episode:
def __init__(self, season, number):
self.season = season
self.number = number
class Season:
episodes = {}
def __init__(self, number):
self.number = number
# create episode data
episode_list = []
for i in range(3):
episode_list.append(Episode(1, i+1))
for i in range(3):
episode_list.append(Episode(2, i+1))
for i in range(3):
episode_list.append(Episode(3, i+1))
# group episodes by seasons
seasons = {}
for episode in episode_list:
for season_number in range(1, 4):
season = Season(season_number)
for episode in episode_list:
if episode.season == season_number:
season.episodes[episode.number] = episode
seasons[season_number] = season
# print result
for sn, s in seasons.items():
for en, e in s.episodes.items():
print "S" + str(e.season) + "E" + str(e.number)
这是错误的,(根据我创建的数据)应该是:
S1E1S1E2
S1E3
S2E1
S2E2
S2E3
S3E1
S3E2
S3E3
# required classes
class Episode:
def __init__(self, season, number):
self.season = season
self.number = number
class Season:
episodes = {}
def __init__(self, number):
self.number = number
# create episode data
episode_list = []
for i in range(3):
episode_list.append(Episode(1, i+1))
for i in range(3):
episode_list.append(Episode(2, i+1))
for i in range(3):
episode_list.append(Episode(3, i+1))
# group episodes by seasons
seasons = {}
for episode in episode_list:
for season_number in range(1, 4):
season = Season(season_number)
for episode in episode_list:
if episode.season == season_number:
season.episodes[episode.number] = episode
seasons[season_number] = season
# print result
for sn, s in seasons.items():
for en, e in s.episodes.items():
print "S" + str(e.season) + "E" + str(e.number)
在这里,您已经创建了一个类属性
class Season:
episodes = {}
def __init__(self, number):
self.number = number
class Season:
def __init__(self, number):
self.episodes = {}
self.number = number
这意味着在所有季节实例中共享相同的dict
您应该将其设置为实例属性
class Season:
episodes = {}
def __init__(self, number):
self.number = number
class Season:
def __init__(self, number):
self.episodes = {}
self.number = number
这是你的问题:
class Season:
episodes = {}
剧集
是类属性。所有季
s共享相同的剧集
dict。您需要将剧集
设置为实例属性,如下所示:
def __init__(self, number):
self.episodes = {}
self.number = number
所有其他属性都正确,所以这是一个类属性而不是实例属性,这有点奇怪
另外,请注意在字典上循环:
for sn, s in seasons.items():
for en, e in s.episodes.items():
不保证会下任何特别的订单。你可能会在第一季之前结束第二季。如果有必要,您可以使用排序的循环:
for sn, s in sorted(seasons.items()):
for en, e in sorted(s.episodes.items()):
非常感谢,这绝对解决了我的问题。和往常一样,最终这是显而易见的。但在花了很长时间研究这个之后,我再也看不到它了;)非常感谢你的帮助。另外,你最后的评论非常有用,我可以肯定地用它来确保我得到了正确的顺序。非常感谢!