【问题标题】:python map: with 2 lambda functions get transposed_row_num for each row, value pair in a matrixpython map:使用2个lambda函数为每行获取transposed_row_num,矩阵中的值对
【发布时间】:2020-07-15 20:15:49
【问题描述】:

(请注意,我希望找到一种不使用列表理解的方式)

假设我有以下数据(0,1,2 索引行号,[[111,20,3,4], [5,66,7,8], [9,10,11,12]] 是原始矩阵的行)

df1 = [(0, [111, 20, 3, 4]), 
 (1, [5, 66, 7, 8]),
 (2, [9, 10, 11, 12])]

我想在 map 函数中使用 2 个 lambda 函数获得以下输出。它的格式为:(transposed_row_num, (original_row_num, value)) 对每一行(例如,行是[111, 20, 3, 4] 等)。

transposed_row_num 是这些行的列号。比如第0行的20的列号是1,所以应该是(1,(0,20))):

 # Desired output:
 [[(0, (0, 111)), (1, (0, 20)), (2, (0, 3)), (3, (0, 4))],
  [(0, (1, 5)), (1, (1, 66)), (2, (1, 7)), (3, (1, 8))],
  [(0, (2, 9)), (1, (2, 10)), (2, (2, 11)), (3, (2, 12))]]

我尝试了以下代码,但出现错误:

map2 = map(lambda x: [x[0]] + list(map(lambda y: y[0], x[1].index(y))),
df1)
list(map2)

# ValueError: [[111, 20], [3, 4]] is not in list

【问题讨论】:

  • 您可能会考虑接受答案以奖励那些对您有帮助的人,或者至少发表评论以解释缺少的内容;)

标签: python mapreduce data-manipulation


【解决方案1】:
  1. 您可以使用嵌套的list comprehension 来实现,这样更简单,代码也更好

    result = [
        [(idx_in, (row[0], val)) for idx_in, val in enumerate(row[1])]
        for row in df1
    ]
    
  2. 然后把外面的list comprehension改成map操作

    result = list(map(lambda row: [(idx_in, (row[0], val)) for idx_in, val in enumerate(row[1])], df1))
    
  3. 然后将内部的list comprehension改成map操作

    result = list(map(lambda row: 
             list(map(lambda idx_val: (idx_val[0], (row[0], idx_val[1])), enumerate(row[1]))), df1))
    

【讨论】:

  • 我希望找到一种不使用列表理解和枚举的方法。那么什么方法是可能的?
  • @lll 为什么有些人想避免使用某些方法,只是利用 pytohn 为您提供的东西,不要惩罚您^^ Enumerate 允许预先执行,因为它避免使用 @ 查找每个值987654329@这使它看起来 On^2 而不是 On
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多