我只需要使用相同的方法将 JavaScript 问题的解决方案转换为 Python 代码

Posted

技术标签:

【中文标题】我只需要使用相同的方法将 JavaScript 问题的解决方案转换为 Python 代码【英文标题】:I just need to turn solution of JavaScript problem into Python code using the same approach 【发布时间】:2020-09-26 21:59:44 【问题描述】:

我一直坚持使用相同的方法将这个 JS 字谜问题转换为 Python 解决方案。 问题来了:

这里是 javascript 解决方案:

    if (first.length !== second.length) 
        return false;
    

    const lookup = ;

    for (let i = 0; i < first.length; i++) 
        let letter = first[i];
        // if letter exists, increment, otherwise set to 1
        lookup[letter] ? (lookup[letter] += 1) : (lookup[letter] = 1);
    

    for (let i = 0; i < second.length; i++) 
        let letter = second[i];
        // can't find letter or letter is zero then it's not an anagram
        if (!lookup[letter]) 
            return false;
         else 
            lookup[letter] -= 1;
        
    

    return true;


console.log(validAnagram('anagram', 'nagaram'));

这是我使用相同方法的 Python 代码:

    if len(first) != len(second):
        return False

    lookup = 

    for char in first:
        letter = first[char]
        if lookup[letter]:
            lookup[letter] += 1
        else:
            lookup[letter] = 1

    for char in second:
        letter = second[char]
        if not lookup[letter]:
            return False
        else:
            lookup[letter] -= 1

    return True


print(valid_anagram("anagram", "nagaram"))

这是我在运行 Python 解决方案时遇到的错误:

letter = first[char] TypeError: string indices must be integers

【问题讨论】:

【参考方案1】:

这是相同的解决方案,它使用 dict 来计算您的 Java 代码之类的字母:

from collections import Counter

def valid_anagram( str1, str2 ) :
    return Counter(str1) == Counter(str2)

测试:

>>> valid_anagram('anagram', 'nagaram')
True
>>> 

我在下面写,我在这里再次写,使用python的重点不是重新发明***,而是使用现有的库来使代码紧凑、快速和易于理解。

以你的代码为例:

for char in first:
    letter = first[char]
    if lookup[letter]:
        lookup[letter] += 1
    else:
        lookup[letter] = 1

这可以改写为:

lookup = dict()
for letter in first:
    if lookup[letter]:
        lookup[letter] += 1
    else:
        lookup[letter] = 1

或者,更好:

lookup = Counter()
for letter in first:
    lookup[letter] += 1

或者,甚至更好:

lookup = Counter( first )

那么为什么要浪费时间和空间......

【讨论】:

顺便说一句,它是 JavaScript。你能像 Javascript 代码一样不使用 import 或模块,只使用纯常规 for 循环和 if elif 语句。 @AbdifatahAli 使用 python 的重点不是重新发明***,而是使用现有的库来使代码紧凑、快速且易于理解。 @AbdifatahAli 添加到答案中【参考方案2】:

您试图传入一个字符串来获取索引,而不是传入一个整数。

first = "hello"
for char in first:
      print(char) 

输出:

h
e
l
l
o

要获取索引,请使用:

for char in range(len(first)):
   print(char)

输出:

0
1
2
3
4

这里有一个更简单的解决方案

def valid_anagram(str1, str2):
    list_str1 = list(str1)
    list_str1.sort()
    list_str2 = list(str2)
    list_str2.sort()

    return (list_str1 == list_str2)

【讨论】:

我很欣赏您的解决方案和帮助,但我正在尝试使用与 JavaScript 方法相同的解决方案。

以上是关于我只需要使用相同的方法将 JavaScript 问题的解决方案转换为 Python 代码的主要内容,如果未能解决你的问题,请参考以下文章

将硬币转换为数组但输出相同

在HashMap中使用相同的对象作为键和值

问:使用 DOM 将 Javascript(通过链接到 HTML 文件)添加到自定义元素

我如何从多个相同的获取请求中连接/合并多个 json?

Ruby on Rails:将数据调用到 javascript 中的首选方法?

javascript es6 多维数组对象相同属性值{key:value}的求和