Loops 打印dict键';价值';时间,或者类似循环调度

Loops 打印dict键';价值';时间,或者类似循环调度,loops,python-2.7,dictionary,Loops,Python 2.7,Dictionary,我知道如何迭代它: obj = {'a1':3,'a2':5,'a3':1} 输出: for k,v in obj.iteritems(): print k 对于打印键值次数,我执行了以下操作: a1 a2 a3 我得到的输出: for k,v in obj.iteritems(): for v in range(0,v): print k 但我希望输出基于值时间,然后交替: 期望输出: a1 a1 a1 a2 a2 a2 a2 a2 a3 这真的没有一

我知道如何迭代它:

obj = {'a1':3,'a2':5,'a3':1}
输出:

for k,v in obj.iteritems():
    print k
对于打印键
次数,我执行了以下操作:

a1 a2 a3
我得到的输出:

for k,v in obj.iteritems():
    for v in range(0,v):
        print k
但我希望输出基于
时间,然后交替:

期望输出:

a1 a1 a1 a2 a2 a2 a2 a2 a3

这真的没有一个好办法。您可以采用这种方法,制作一份
obj
的副本,然后使用副本中的值来跟踪打印每个键的次数:

a1 a2 a3 a1 a2 a1 a2 a2 a2

这真的没有一个好办法。您可以采用这种方法,制作一份
obj
的副本,然后使用副本中的值来跟踪打印每个键的次数:

a1 a2 a3 a1 a2 a1 a2 a2 a2
一行:(假设obj中没有任何代码)

一行:(假设obj中没有任何代码)


使用itertools的配方。您需要使用itertools页面中的
循环
配方,该配方也复制如下:

[x for y in map(None, *[[k]*v for k, v in sorted(obj.iteritems())]) for x in y if x is not None]
注意,这并没有给你确切的你要找的。。。正如其他答案之一所说,您可以使用字典的排序版本(也包括在下面),或者您可以首先使用OrderedICT。请记住,如果使用OrderedICT并将其初始化为
my_odict=OrderedICT({1:1,2:2,3:3})
,python将首先创建字典-无序-然后从中创建OrderedICT,这可能不是您想要的

分类:

from itertools import islice, cycle, repeat

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))


# Now, the real recipe starts
obj = {'a1':3,'a2':5,'a3':1}
objiter = [repeat(x,y) for x,y in obj.items()]
objlist = list(roundrobin(*objiter))
objlist
['a1', 'a3', 'a2', 'a1', 'a2', 'a1', 'a2', 'a2', 'a2']

显然,有序字典配方与常规字典配方相同,只需传入一个有序字典。

使用itertools的配方。您需要使用itertools页面中的
循环
配方,该配方也复制如下:

[x for y in map(None, *[[k]*v for k, v in sorted(obj.iteritems())]) for x in y if x is not None]
注意,这并没有给你确切的你要找的。。。正如其他答案之一所说,您可以使用字典的排序版本(也包括在下面),或者您可以首先使用OrderedICT。请记住,如果使用OrderedICT并将其初始化为
my_odict=OrderedICT({1:1,2:2,3:3})
,python将首先创建字典-无序-然后从中创建OrderedICT,这可能不是您想要的

分类:

from itertools import islice, cycle, repeat

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))


# Now, the real recipe starts
obj = {'a1':3,'a2':5,'a3':1}
objiter = [repeat(x,y) for x,y in obj.items()]
objlist = list(roundrobin(*objiter))
objlist
['a1', 'a3', 'a2', 'a1', 'a2', 'a1', 'a2', 'a2', 'a2']

显然,有序字典配方与常规字典配方相同,只需传入一个有序字典。

一行不使用额外空间(
排序的
可能会使用额外的O(n)空间),python 3:

objiter = [repeat(x, obj[x]) for x in sorted(obj.keys())]
objlist = list(roundrobin(*objiter))
objlist
['a1', 'a2', 'a3', 'a1', 'a2', 'a1', 'a2', 'a2', 'a2']

一个不使用额外空间的行程序(
排序的
可能会使用额外的O(n)空间),python 3:

objiter = [repeat(x, obj[x]) for x in sorted(obj.keys())]
objlist = list(roundrobin(*objiter))
objlist
['a1', 'a2', 'a3', 'a1', 'a2', 'a1', 'a2', 'a2', 'a2']

返回-a3。第一线返回-a3中也缺少右大括号。此外,第一行True中缺少右大括号,如果有大量数据,则将
排序的
移动到循环外会更有效。如果有大量数据,则将
排序的
移动到循环外会更有效。是否要按排序的顺序排列键?您在当前代码中获得这些密钥是巧合。您希望密钥按顺序排序吗?事实上,你在你当前的代码中得到它们是一个巧合。回答得很好+回答得很好+1.