Разделение значений в словари и их подсчет в Python

#python

#python

Вопрос:

Я пытаюсь взять список чисел, разделить значения по словарям на основе int и float типов, а затем подсчитать количество их вхождений. У меня проблемы с логикой.

С идеальным выводом, выглядящим так:

 'int' : [1 : 3, 2 : 4, 5 : 1, 6 : 2],
'float' : [1.0 : 2, 2.3 : 4, 3.4 : 4]
  

Это то, что у меня есть до сих пор, и я продолжаю ломать голову:

 values = [1, 2.0, 3.0, 1, 1, 3, 4.0, 2, 1.0]

types = {
    'int': [],
    'float': []
}
for obj in values:
      if isinstance(obj, int):
          types['int'].append(obj)
      elif isinstance(obj, float):
        types['float'].append(obj)

for v in types:
    if v not in types['int']:
        counts = 0
    counts[v]  = 1
    elif v not in types['float']:
        counts = 0
    counts[v]  = 1

print(counts)
  

С идеальным результатом, являющимся:

 'int' : [1 : 3, 2 : 4, 5 : 1, 6 : 2],
'float' : [1.0 : 2, 2.3 : 4, 3.4 : 4]
  

Комментарии:

1. Этот код даже не будет компилироваться. второе elif не имеет if отношения к нему, потому что counts[v] = 1 выше него находится на том же уровне. Кроме того, вы обрабатываете counts как список, но также устанавливаете для него значение 0. Это странно. — Я не могу точно сказать, что вы пытаетесь здесь сделать.

Ответ №1:

Первая половина кажется прекрасной, но вторая половина может улучшиться.

попробуйте:

 for k,v in types.items():
    print(k, len(v))
  

Пример ввода:

 values = [1.1,2,3.1]
  

Выдает этот результат:

 int 1
float 2
  

Комментарии:

1. Да … это кажется правильным. Я предлагаю добавить образец values массива и сопутствующий вывод.

Ответ №2:

Как насчет чего-то подобного:

Это использует type функцию, чтобы предоставить вам ключи для результирующего массива (‘int’ и ‘float’) без необходимости указывать эти строки.

 numbers = [1,1,1,2.1,2.1,2.2, 3,3.1]

def tally_by_type(numbers):
    result = {}
    for v in numbers:
        k = type(v).__name__
        result[k] = result.get(k, {})
        result[k][v] = result[k].get(v,0)
        result[k][v] = result[k][v]   1
    return result

tally_by_type(numbers)

{'int': {1: 3, 3: 1}, 'float': {2.1: 2, 2.2: 1, 3.1: 1}}
  

Интересно, что это также работает, если у вас там есть строки

 tally_by_type([1,2,3,3,3,'a','a','b'])
{'int': {1: 1, 2: 1, 3: 3}, 'str': {'a': 2, 'b': 1}}
  

Ответ №3:

вы можете попробовать что-то вроде этого:

 ints={}
floats={}
list=[3.5,27,87.8,1.02,66]
for val in list:
    if isinstance(val,int):
        ints[str(val)]=val
    elif isinstance(val,float):
        floats[str(val)]=val
print("ints dictionaryn",ints,"number of instances",len(ints))
print("floats dictionaryn",floats,"number of instances",len(floats))
  

который печатает:

 ints dictionary
 {'27': 27, '66': 66} number of instances 2
floats dictionary
 {'3.5': 3.5, '87.8': 87.8, '1.02': 1.02} number of instances 3
  

Я не совсем понял, какие ключи словаря вы хотите использовать, хотя предположил, что они вам действительно не нужны.

Комментарии:

1. Я не уверен, почему вы решили добавить этот ответ, который является А) дубликатом важной части первого ответа, добавленного за 5 минут до вас, и Б) изменяет весь код OPs, который менее полезен для него, учитывая, что большая часть его кода работала отлично. — С положительной стороны, ваш вывод хорошо отформатирован 🙂

2. Я думаю, что идея состоит в том, чтобы в конечном итоге получить ‘int’ : 1 : 2, 2:4, ‘ плавающие’ : 1.0 : 3, 3.4: 4, и т. д