#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, и т. д