使用多个大小的值对字典进行排序

Pep*_*1nt 9 python sorting dictionary loops python-3.x

我有一本需要排序的字典.我知道字典无法排序,所以我正在构建一个列表来执行基于索引的排序.我遇到的问题是多个键上有重复的值; 此外,值可以是多个列表.

字典:

my_dict = {
    '1' : ['Red', 'McDonald\'s'],
    '2' : [['Orange', 'Wendy\'s'], ['Purple', 'Cookout']],
    '3' : ['Yellow', 'Longhorn'],
    '4' : ['Green', 'Subway'],
    '5' : ['Blue', 'Chipotle'],
    '6' : ['Indigo', 'Taco Bell'],
    '7' : [['Violet', 'Steak n Shake'], ['Dark Red', 'Five Guys']],
    '8' : ['Dark Orange', 'Wendy\'s'],
    '9' : ['Aqua', 'Firehouse Subs'],
    '10' : ['Magenta', 'McDonald\'s'],
}
Run Code Online (Sandbox Code Playgroud)

我需要能够通过键(数字),颜色和餐厅对其进行排序.我遇到的问题是,当存在重复时,必须对打印进行分组,而我无法弄清楚如何对我正确生成的列表进行排序.

按编号打印的示例:

1:
    Red, McDonald's

2:
    Orange, Wendy's
    Purple, Cookout

3:
    Yellow, Longhorn

...
Run Code Online (Sandbox Code Playgroud)

按颜色打印的示例:

Aqua:
    Firehouse Subs, 9

Blue:
    Chipotle, 5

Dark Orange:
    Wendy's, 8

...
Run Code Online (Sandbox Code Playgroud)

我的解决方案是使用列表中的每个键和值创建一个列表.我还是新手,我认为这不是迭代这本词典的正确方法,但它适用于给定的词典.

sorted_number = []
for key, value in my_dict.items():
    if len(value[0][0]) > 1:
        working_list = (key, value[0][0], value[0][1], value[1][0], value[1][1])
        sorted_number.append(working_list)
    else:
        working_list = (key, value[0], value[1])
        sorted_number.append(working_list)

sorted_years = sorted(sorted_years, key=lambda y: y[0][0])
for i in sorted_years:
    print('{}:'.format(i[0]))
    if len(i) > 3:
         print('\t{}, {}'.format(i[1], i[2])
         print('\t{}, {}'.format(i[3], i[4]))
    else:
         print('\t{}, {}'.format(i[1], i[2]))
Run Code Online (Sandbox Code Playgroud)

由于某些值是多个列表,因此if/else语句确定该值是一个还是两个列表.然后,这将正确地生成(数字,颜色,餐馆)或(数字,颜色,餐馆,颜色,餐馆)的列表,然后可以按编号对列表进行排序.问题是当我尝试按颜色或餐厅排序时.我知道我可以使列表只有三个元素,以使排序正常工作,但是当我去打印时,我最终将得到多个2和7.同样的结果是餐厅.而且,这并没有解决多家餐馆的问题.我已经搜索并测试了大约五天尝试不同的方法来解压缩字典,但这是我必须解决这个问题的最接近的方法.任何帮助表示赞赏.提前致谢.

为清楚起见,这是数字的打印迭代:

for i in sorted_number:
    print('{}:'.format(i[0]))
    if len(i) > 3:
        print('\t{}, {}'.format(i[1], i[2]))
        print('\t{}, {}'.format(i[3], i[4]))
    else:
        print('\t{}, {}'.format(i[1], i[2]))
Run Code Online (Sandbox Code Playgroud)

Van*_*jx1 1

第一步是将字典转换为列表,并将字典值以元组数组的形式均质化。然后使用itertools 模块中的groupBy函数,您可以按所选参数进行分组。

class RestourantSorter:
    def __init__(self, source):
        self._rList = []
        """ Dict to list [(key, color, restourant name), ....] """
        for key, value in source.items():
            for color, rest in value if isinstance(value[0], list) else [value]:
                self._rList.append((key,color,rest))

    def _byIndex(self, x):
        return int(x[0])
    def _byColor(self, x):
        return x[1]
    def _byName(self, x):
        return x[2]

    def sort(self, sortFn):
        """ Sorted data [(key, [... values ...]), ....] """
        groups = []
        data = sorted(self._rList, key=sortFn)
        for k, g in groupby(data, sortFn):
            groups.append((k, list(g)))
        return groups

    def sortByIndex(self):
        return self.sort(self._byIndex)
    def sortByColor(self):
        return self.sort(self._byColor)
    def sortByName(self):
        return self.sort(self._byName)
Run Code Online (Sandbox Code Playgroud)

工作REPL