【问题标题】:Counting total number of unique characters for Python string计算 Python 字符串的唯一字符总数
【发布时间】:2024-01-23 11:30:01
【问题描述】:

对于我上面的问题,我非常困惑。到目前为止,我想出的代码是:

def count_bases():
    get_user_input()
    amountA=get_user_input.count('A')
    if amountA == 0:
        print("wrong")
    else:
        print ("right",amountA)

def get_user_input():
    one = input("Please enter DNA bases: ")
    two=list(one)
    print(two)

我的思路是我先:
1. 要求用户输入 DNA 碱基 (ATCG)
2.将用户输入改为列表
3. 回到main(count_bases)函数,我统计'A'、'T'、'C'、'G'的个数
4. 对四个不同的基数使用 4 个 if-else 语句。

到目前为止,我的代码只能将用户输入的输出输出到列表中。之后,就会弹出一个错误。
如果有人可以为我指出正确的道路,我们将不胜感激!
谢谢。

【问题讨论】:

  • 这是什么错误?还有,你为什么注释掉第一个def
  • 文件“XXX”,第 98 行,在 count_bases() 文件“XXX”,第 74 行,在 count_bases amountA=get_user_input.count('A') AttributeError: 'function' object has没有属性“计数”
  • 您似乎对函数的使用有误解。在这里读一点,w3schools.com/python/python_functions.asp,如果你想使用.count('A'),你需要使用return语句,然后将其保存到变量中
  • 这段代码有很多问题。 get_user_input 是一个函数,但不返回任何值。您可能需要返回two 并将其分配给main 中的新名称。你对函数如何工作的误解......你能想象一个有数千个函数的程序吗?您希望如何使用函数调用的结果?甚至两次调用一个函数?
  • 我将不胜感激更多有用的建议,谢谢!不幸的是,由于我是 python 的初学者,我根本无法想象一个具有数千个函数的程序。 @彼得伍德

标签: python python-3.x list if-statement split


【解决方案1】:

您可以使用collections.Counter

from collections import Counter

def get_user_input():
    input_str = input("Please enter DNA bases: ")
    c = dict(Counter('ACCAGGA'))
    return c

def count_bases():
    counts = get_user_input()
    dna_base = list("ATCG")
    for base in dna_base:
        if base not in counts.keys():
            print(f"{base} not found")
        else:
            print(f"{base} count: {counts[base]}")

输出当我打电话给count_bases()

Please enter DNA bases: >? ACCAGGCA
A count: 3
T not found
C count: 2
G count: 2

【讨论】:

  • 如何在我的两个函数中实现这个?
  • 谢谢!我现在对计数器功能有了更好的了解:)
  • @aislinx 不客气。如果有帮助,请选择/点赞。
【解决方案2】:

如果您制作一个临时集合,根据定义,它只包含唯一项目/字符怎么办? IE。在unique_chars=set(input_string) 的行中?

要计算所有内容,请使用带有理解的 zip?例如:nr_of_instances=zip(unique_chars, [input_string.count(x) for x in unique_chars])

可能有更简单、更优雅的方法,但要使用一些内置函数……我不是每天都使用 zip,但在这里它可能会派上用场?

【讨论】:

  • set(input_string) 就够了。
  • 谢谢彼得,我只是一个理解力的傻瓜 :-) 我已经编辑了我的答案。
  • 我正要建议使用一套
  • 他需要一个柜台
  • 谢谢,我添加了一种可能的实例计数方式。
【解决方案3】:

一些可能引发错误的错误如下:

  • 您还没有返回来自get_user_input()的DNA字符串列表
  • 由于一些误解,你在函数count_bases()中有一个文本get_user_input,它既不是函数调用也不是变量名。

以下代码供您参考,纠正了提到的错误:

def count_bases():
    inp = get_user_input()
    amountA = inp.count('A')
    if amountA == 0:
        print("wrong")
    else:
        print ("right",amountA)

def get_user_input():
    one = input("Please enter DNA bases: ")
    two = list(one)
    print(two)
    return two

上面的代码将只提供一个碱基的计数,即“A”。为了利用所有碱基的计数,这可能会有所帮助:

def count_bases():
    inp = list(input("Please enter DNA bases: "))
    for base in 'ATCG':
        count_base = inp.count(base)
        if count_base == 0:
            print("Not found.")
        else:
            print ("Count of ", base," is: ", count_base)

【讨论】:

  • 你没有解释你做了什么来修复代码。
  • 如果忽略 typosget_user_input() 会被调用两次。如果我们不解释修复代码的更改,作者将如何理解他/她所犯的错误?
  • 他们不会调用get_user_input 两次。这不是一个错字,它是对如何访问调用函数结果的(有点常见的)误解。
【解决方案4】:
  1. 您的函数 get_user_input() 没有返回值
  2. get_user_input.count('A') 包含一个函数调用,没有括号将无法工作。正确:get_user_input().count('A')
  3. 如 cmets 中所述,get_user_input() 只应调用一次,因为每次调用都会通过 input() 函数收集用户输入。

这应该可行:

    def count_bases():
        char_list = get_user_input()
        for char in 'ATCG':
            char_count = char_list.count(char)
            if char_count < 1:
                print(char + " not found")
            else:
                print(char + " count: " + str(char_count))

    def get_user_input():
        one = input("Please enter DNA bases: ")
        two=list(one)
        return two

【讨论】:

  • 这是他们的主要问题,不了解如何通过为函数调用命名来使用结果。
  • 我现在编辑了答案并添加了可能的解决方案
  • @Boketto 谢谢!我现在对函数的使用方式有了更好的了解,尤其是在调用两个时..
  • print() 函数在 python 中有, 作为多个参数的分隔符。 + 创建新字符串,这不是一个好习惯。 :)
  • 谢谢@RahulSoni。我现在更喜欢像 f"{char} count: {char_count}" 这样的 f-string 语法(不适用于
【解决方案5】:
def count_bases(val: str, character: str) -> int:
    # return the count of character in val
    if character in val:
        return val.count(character)
    else:
        return 0

def get_user_input() -> None:
    # get the input from the user
    value = input('Please enter DNA bases: ')
    # find the unique characters in the input
    characters = ['A', 'T', 'C', 'G']
    # find the count
    for char in characters:
        count = count_bases(value, char)
        if count == 0:
            # do something
        else:
            # do something else

【讨论】:

    最近更新 更多