Python:枚举多个列表中的元素

时间:2015-04-14 14:48:20

标签: python list dictionary

假设我有一个包含以下列表的字典:

{0: [31, 32, 58, 59], 1: [31, 32, 12, 13, 37, 38], 2: [12, 13]}

我正试图从中获取以下内容:

{0: [1, 2, 3, 4], 1: [1, 2, 5, 6, 7, 8], 2: [5, 6]}

所以我按照出现的顺序重新计算所有条目,但跳过那些已经重新编号的条目。

我现在拥有的是一堆for循环来回运行,但看起来并不好,有谁能告诉我在Python 2.7中应该怎么做?

谢谢

4 个答案:

答案 0 :(得分:1)

只需使用这样的函数:

def renumerate(data):
    ids = {}
    def getid(val):
        if val not in ids:
            ids[val] = len(ids) + 1
        return ids[val]
    return {k : map(getid, data[k]) for k in sorted(data.keys())}

实施例

>>> data = {0: [31, 32, 58, 59], 1: [31, 32, 12, 13, 37, 38], 2: [12, 13]}
>>> print renumerate(data)
{0: [1, 2, 3, 4], 1: [1, 2, 5, 6, 7, 8], 2: [5, 6]}

答案 1 :(得分:1)

import operator
data = {0: [31, 32, 58, 59], 1: [31, 32, 12, 13, 37, 38], 2: [12, 13]}


# the accumulator is the new dict with renumbered values combined with a list of renumbered numbers so far
# item is a (key, value) element out of the original dict
def reductor(acc, item):
   (out, renumbered) = acc
   (key, values)     = item
   def remapper(v):
       try:
           x = renumbered.index(v)
       except ValueError:
           x = len(renumbered)
           renumbered.append(v)
       return x
   # transform current values to renumbered values
   out[key] = map(remapper, values)
   # return output and updated list of renumbered values
   return (out, renumbered)

# now reduce the original data
print reduce(reductor, sorted(data.iteritems(), key=operator.itemgetter(0)), ({}, []))

答案 2 :(得分:1)

如果您不担心内存或速度,可以使用中间字典来映射新值:

a = {0: [31, 32, 58, 59], 1: [31, 32, 12, 13, 37, 38], 2: [12, 13]}
b = {}
c = {}

for key in sorted(a.keys()):
    c[key] = [b.setdefault(val, len(b)+1) for val in a[key]]

答案 3 :(得分:0)

data = {0: [31, 32, 58, 59], 1: [31, 32, 12, 13, 37, 38], 2: [12, 13]}

from collections import defaultdict
numbered = defaultdict(lambda: len(numbered)+1)


result = {key: [numbered[v] for v in val] for key, val in sorted(data.iteritems(), key=lambda item: item[0])}
print result