【问题标题】:Please help me to convert C++ algorithm code to Python [closed]请帮我将 C++ 算法代码转换为 Python [关闭]
【发布时间】:2020-11-07 00:16:09
【问题描述】:

谁能帮我修复从 C++ 到 Python 的重写代码: 初始代码是这样的:

    vector<int> b = a;
    unordered_map<int,int> m;
 
    sort(a.begin(),a.end());
    for(int i = 0; i < a.size(); i++){
        m[a[i]] = i + 1;
    }
 
    vector<int> ans;
    for(int i = 0; i < b.size(); i++){
        ans.push_back(m[b[i]]);
    }
    return ans;
} 

例如:

Input: [100, 5, 70, 2]
Output: [4, 2, 3, 1]

我的 Python 版本在这里,但答案不正确:

def compress(arr):
    b = []
    b = arr
    m = {}
    for i in range(len(arr)):
        m[arr[i]] = i + 1
    ans = []
    for i in range(len(b)):
        ans.append(m[b[i]])
    return ans

我的输出:

Input: [100, 5, 70, 2]
Output: [1, 2, 3, 4]

请帮我看看哪里出错了?

【问题讨论】:

  • 我的建议是根本不要尝试“翻译”代码,而是从与语言无关的算法描述开始尝试以您选择的语言从头开始实现它。
  • 我什至无法猜测代码应该做什么。请首先清楚地解释这一点。
  • 这段代码只是给出了列表中唯一元素的最新索引
  • 当然,我们的想法是压缩给定的唯一元素数组并返回元素的索引,方法是保持元素的顺序,如示例中所示。

标签: python c++ algorithm


【解决方案1】:

您忘记对输入数组进行排序,当您对数组 a 进行排序并且您已将数组 a 分配给 b 时,b 会自动排序并且与 a 相同,因此您需要创建 a 的深层副本或分配新列表通过附加所有元素到 a 的 b

def func(a):
        b =list(a)
        m ={}        
        a.sort()            
        for i in range(len(a)):
            m[a[i]] = i+1  
        ans = []
        for i in range(len(b)):
            ans.append(m[b[i]])
        return ans

【讨论】:

  • 可以,但不会影响我的输出
  • @jam 更新解决方案
  • 哦,谢谢,我忘了!我忘了深拷贝!
【解决方案2】:

这是解决您问题的 Python 解决方案:

>>> a  = [100, 5, 70, 2]
>>> b = range(len(a))
>>> sorted(b, key = lambda x : a[x] )
[3, 1, 2, 0]
>>> 

如果您希望您的索引从 1 开始(不是一个非常 Python 的方法):

>>> a  = [100, 5, 70, 2]
>>> b = range(1,len(a)+1)
>>> sorted(b, key = lambda x : a[x-1] )
[4, 2, 3, 1]
>>> 

【讨论】:

  • 是的,这就是我要找的!如果我没有独特的元素并且需要这些类型的输入/输出,我可以再问一个问题吗? Input: [100, 2, 70, 2] # Output: [3, 1, 2, 1]
  • 关于重复项的问题,你得到的答案不能有重复的索引,所以如果你的输入是[ 10, 10, 10, 10 ],你仍然会得到[1, 2, 3, 4],而不是[1,1,1,1]
  • 是的,如果元素相似,我应该返回 [1,1,1,1] 所以它们的索引也应该相似
  • 问题是如何以更 Pythonic 的方式做到这一点?
  • 您的原始代码未返回 [3, 1, 2, 1] 以供输入:[100, 2, 70, 2] -- 请检查一下
【解决方案3】:

您在 C++ 代码中遗漏了这一行:

sort(a.begin(),a.end());

您应该在第一个循环之前对您的arr 进行排序。

【讨论】:

  • 可以,但不会影响我的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
相关资源
最近更新 更多