Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在二维字典中按两个字段对python对象分组_Python_List_Dictionary_Reference_Grouping - Fatal编程技术网

在二维字典中按两个字段对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

我有一个python类
剧集
,它有两个字段:
季节
数字
。我在
剧集列表
中有一个对象列表。这张单子是按季节排列的,然后是按情节排列的。在下面的示例中,数据是按此顺序创建的。 我想做的是:我想创建一个
seasure
对象的字典。每个
季节
对象也有一个字典作为名为
剧集
的字段。本词典应包含所有具有本季编号的
插曲
对象。 在下面的最小示例的末尾,我打印了分组数据,结果是:

S3E1
S3E2
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)
这是错误的,(根据我创建的数据)应该是:

S1E1
S1E2
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()):

非常感谢,这绝对解决了我的问题。和往常一样,最终这是显而易见的。但在花了很长时间研究这个之后,我再也看不到它了;)非常感谢你的帮助。另外,你最后的评论非常有用,我可以肯定地用它来确保我得到了正确的顺序。非常感谢!