【问题标题】:Python divide each string by the total lenght of stringPython将每个字符串除以字符串的总长度
【发布时间】:2019-05-11 19:59:07
【问题描述】:

感谢您的帮助和耐心。

我是 python 新手,正在尝试计算特定原子符号出现的次数除以原子总数。因此该函数接受一个字符串列表作为参数,并返回一个包含“C”、“H”、“O”和“N”分数的列表。但我继续得到一个结果,而不是为我的每个原子得到所有结果。我的尝试如下:

Atoms = ['N', 'C', 'C', 'O', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'O', 'H']

def count_atoms (atoms):
    for a in atoms:
        total = atoms.count(a)/len(atoms)
        return total

然后

faa = count_atoms(atoms)
print(faa)

但是我只得到一个结果,即 0.07692307692307693。我应该得到一个以 [0.23076923076923078,..etc] 开头的列表,但我不知道该怎么做。我应该使用 for 循环和 return 语句计算分子中“C”、“H”、“O”和“N”原子符号的分数。 :(请帮忙,我们将不胜感激。

【问题讨论】:

  • 只要你在函数中return,函数就会退出。这意味着它只通过你的循环一次。尝试append()将您的值添加到列表中,然后在循环外返回整个列表
  • 感谢您的快速回复

标签: python function for-loop return jupyter-notebook


【解决方案1】:

一个简单的班轮应该做

[atoms.count(a)/float(len(atoms)) for a in set(atoms)]

或者更好地使用理解创建字典

{a:atoms.count(a)/float(len(atoms)) for a in set(atoms)}

输出

{'C': 0.23076923076923078,
 'H': 0.5384615384615384,
 'N': 0.07692307692307693,
 'O': 0.15384615384615385}

如果您仍想使用 for 循环。我建议去map,这样会干净很多

atoms = ['N', 'C', 'C', 'O', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'O', 'H'] 

def count_atoms (a):
    total = atoms.count(a)/float(len(atoms))
    return total

map(count_atoms,atoms)

【讨论】:

  • 感谢您的回答
【解决方案2】:

@ganderson 评论解释了这个问题。至于这里的替代实现是使用collections.Counter

from collections import Counter

atoms = ['N', 'C', 'C', 'O', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'O', 'H']

def count_atoms(atoms):
    num = len(atoms)
    return {atom:count/num for atom, count in Counter(atoms).items()}

print(count_atoms(atoms))

【讨论】:

    【解决方案3】:

    最好返回一个字典,这样你就知道分数对应于哪个元素:

    >>> fractions = {element: Atoms.count(element)/len(Atoms) for element in Atoms}
    >>> fractions
    {'N': 0.07692307692307693, 'C': 0.23076923076923078, 'O': 0.15384615384615385, 'H': 0.5384615384615384}
    

    然后,您甚至可以查找特定元素的分数,例如:

    >>> fractions['N']
    0.07692307692307693
    

    但是,如果您必须使用 for 循环和 return 语句,那么来自 @not_a_bot_no_really_82353 的答案将是正确的。

    【讨论】:

    • 如果你打算走那条路,不妨在 Atoms 的 set 上进行操作,以免每次都不必要地重复多次:{element: Atoms.count(element)/len(Atoms) for element in set(Atoms)}
    • 非常感谢
    【解决方案4】:

    那么,您在第一个循环中返回变量 total。为什么不使用列表来存储您的值?像这样:

    atoms = ['N', 'C', 'C', 'O', 'H', 'H', 'C', 'H', 'H', 'H', 'H', 'O', 'H'] #python is case sensitive!
    
    def count_atoms (atoms):
        return_list = [] #empty list
        for a in atoms:
            total = atoms.count(a)/len(atoms)
            return_list.append(total) #we add a new item
        return return_list #we return everything and leave the function
    

    【讨论】:

    • 另外请注意:python 区分大小写。所以请使用原子而不是原子。
    • 没问题,只需将问题标记为已回答,以便所有人都知道您的问题已解决。
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多