Python делит каждую строку на общую длину строки - PullRequest
0 голосов
/ 11 декабря 2018

Спасибо за вашу помощь и терпение.

Я новичок в 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, .. и т. Д.], Но я не знаю, как это сделать.Я должен был рассчитать долю атомных символов «C», «H», «O» и «N» в молекуле, используя цикл for и оператор return.:( Пожалуйста, помогите, это будет оценено.

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

@ Комментарий Гандерсона объясняет проблему.что касается альтернативной реализации, то здесь используется collection.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))
0 голосов
/ 11 декабря 2018

Было бы лучше вернуть словарь, чтобы вы знали, какому элементу соответствует дробь:

>>> 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 будет правильным.

0 голосов
/ 11 декабря 2018

Простой однострочный лайнер должен делать

[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)
0 голосов
/ 11 декабря 2018

Ну, вы возвращаете переменную итоговую в первом цикле.Почему вы не используете список для хранения ваших значений?Как это:

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
...