从Python列表列表到整数索引的反向映射

时间:2014-07-18 20:31:34

标签: python list

我在Python中有一个列表,表示找到特定产品的最佳商店,如下所示(我们只返回下面的列表):

Index: Product     0  1  2  3  4  5  6  7  8  9
Value: Store      [5, 6, 1, 7, 3, 4, 2, 0, 8, 9]

现在,每个产品都有一个独特的商店,因此我可以将其转换为一个列表,这些列表可以对商店和每个商品进行索引:

Index: Store               0    1    2    3    4    5    6    7    8    9
Value: List of Products  [[7], [2], [6], [4], [5], [0], [1], [3], [8], [9]]

使用此功能:

def convertList(l):
    return [[i] for (i, j) in sorted(list(enumerate(l)), key=lambda e:e[1])]

但是现在我不知道如何将它们组合在一个商店中最好找到多个产品的情况下(在这种情况下,产品3和9最好在商店7,并且什么都不应该在商店9):

Index: Product     0  1  2  3  4  5  6  7  8  9
Value: Store      [5, 6, 1, 7, 3, 4, 2, 0, 8, 7]

输出应如下所示:

Index: Store               0    1    2    3    4    5    6    7       8    9
Value: List of Products  [[7], [2], [6], [4], [5], [0], [1], [3, 9], [8], []]

我知道我在convertList中遇到了排序函数,但我不知道如何继续。我正在练习列表理解,所以如果可行,我想使用一个。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

我认为如果不使用列表解析,这将更具可读性。列表推导适用于一对一映射步骤,但这不是。

最好循环输入并将每个项目添加到输出数组的右侧元素:

# assuming your input is in product_to_store
store_to_product = [[] for i in range(10)]
for product, store in enumerate(product_to_store):
  store_to_product[store].append(product)

答案 1 :(得分:2)

老实说,这感觉就像是一个默认的时间而不是列表。

defaultdict将为任何不存在的键返回默认值 - 该值可以是None,' hello world'或列表。 (该值必须是可调用的,所以如果你真的想要一个默认字符串,你可以将它封装在一个lambda或其他类似的东西中,但想法是一样的)

from collections import defaultdict

mydict = defaultdict(list)
mydict['Store_1'].append(product) #automatically creates list for this entry if one does not exist

从这里你可以简单地遍历你的列表并将它们作为索引分配给键。整数可以用作字典键,所以没有问题。

for store, product in enumerate(my_list):
    mydict[store].append(product)

答案 2 :(得分:1)

更简单的选项是defaultdict

from collections import defaultdict

stores = defaultdict(list)

for store, product in enumerate(list_of_products):
    for p in product:
        stores[store].append(product)

答案 3 :(得分:1)

写了一个快速的程序来做到这一点。前两个将创建您的数据,最后一个将根据您的索引进行排序。

array = []
map = []

# get random array
for j in range(0, 10):
    array.append(random.randint(0, 9))

# initialize to empty
for i in range(0, 10):
    map.append([])

# sort
for i in range(0, len(array)):
    temp = [i]
    map[array[i]] = map[array[i]] + temp


print(array)
print(map)

将输出如下内容:

[3, 7, 7, 2, 1, 6, 0, 8, 6, 5]
[[6], [4], [3], [0], [], [9], [5, 8], [1, 2], [7], []]