#python #count
Вопрос:
У меня есть следующий список: [[a,a,b,a,b,b,b],[5,5,4,5],[5,1,5],[2,5],[4,5],[5],[3],[5]]
Количество списков, содержащих числовые значения, такое же, как и элементов в первом списке (который содержит буквы «a» или «b»). Длина списков, содержащих числа, априори неизвестна.
Таким образом, каждая буква соответствует списку:
a —> 5,5,4,5
a —> 5,1,5
b —> 2,5
a —> 4,5
b —> 5
b —> 3
b —> 5
А затем подсчитайте каждое значение по буквам «a» или «b», сохраняя при этом значения, например, «a» имеет в общей сложности 6 «5», 2 «4», и 1 «1». «b» имеет в общей сложности 3 «5», 1 «2», и 1 «3».
Ожидаемый результат:
«а» имеет в общей сложности 6 «5», 2 «4», и 1 «1».
«б» имеет в общей сложности 3 «5», 1 «2», и 1 «3».
Комментарии:
1. Хорошая проблема, в какой части ты застрял?
2. Где ваш код?
Ответ №1:
Один подход:
from collections import Counter, defaultdict
lst = [["a", "a", "b", "a", "b", "b", "b"], [5, 5, 4, 5], [5, 1, 5], [2, 5], [4, 5], [5], [3], [5]]
result = defaultdict(Counter)
head, *tail = lst
for key, values in zip(head, tail):
result[key] = Counter(values)
for key, counts in result.items():
print(key, counts)
Выход
a Counter({5: 6, 4: 2, 1: 1})
b Counter({5: 3, 2: 1, 3: 1})
Альтернатива:
head, *tail = lst
counts = Counter((key, value) for key, values in zip(head, tail) for value in values)
result = defaultdict(dict)
for (key, value), count in counts.items():
result[key][value] = count
for key, value in result.items():
print(key, value)
Выход
a {5: 6, 4: 2, 1: 1}
b {2: 1, 5: 3, 3: 1}
Комментарии:
1. Что, если вместо «a» и «b» у меня есть «Строка 1» и «Строка 2» ?
2. Он будет работать с «Строкой 1» и «Строкой 2». Просто измените «a» и «b» на «String1» и «String2».
3. @ElTitoFranki Попробуй
head, tail = lst
, убери*
Ответ №2:
Это был бы мой подход:
inputs = [['a','a','b','a','b','b','b'],[5,5,4,5],[5,1,5],[2,5],[4,5],[5],[3],[5]]
counts = {}
for k, v in zip(inputs[0], inputs[1:]):
if k in counts.keys():
counts[k] = v
else:
counts[k] = v
Мой вывод для этого:
{'a': [5, 5, 4, 5, 5, 1, 5, 4, 5], 'b': [2, 5, 5, 3, 5]}
Затем вы можете использовать счетчики, len () и т.д., Чтобы получить точное форматирование вывода, которое вы хотите.
Ответ №3:
Смотрите ниже ( Counter
и defaultdict
каковы основные «игроки»)
from collections import Counter,defaultdict
results = defaultdict(Counter)
data = [['a','a','b','a','b','b','b'],[5,5,4,5],[5,1,5],[2,5],[4,5],[5],[3],[5]]
for idx,x in enumerate(data[0],1):
results[x].update(data[idx])
for letter,counter in results.items():
print(f'{letter} -> {counter}')
выход
a -> Counter({5: 6, 4: 2, 1: 1})
b -> Counter({5: 3, 2: 1, 3: 1})
Ответ №4:
Это забавная проблема, которую нужно решить.
from collections import Counter
data = [['a','a','b','a','b','b','b'],[5,5,4,5],[5,1,5],[2,5],[4,5],[5],[3],[5]]
counts = { k:Counter() for k in list(set(data[0])) }
for i, k in enumerate(data[0], 1):
counts[k].update(data[i])
print(counts)
# {'a': Counter({5: 6, 4: 2, 1: 1}), 'b': Counter({5: 3, 2: 1, 3: 1})}
Ответ №5:
l = [["a","a","b","a","b","b","b"],[5,5,4,5],[5,1,5],[2,5],[4,5],[5],[3],[5]]
d = {}
for i in l[0]:
if i not in d.keys():
d[i] = []
for i, item in zip(l[0],l[1:]):
d[i].append(item)
count_dict = {}
for i in d.keys():
count_dict[i] = {}
for j in d[i]:
elements = set(j)
for k in elements:
if str(k) not in count_dict[i].keys():
count_dict[i][str(k)] = j.count(k)
else:
count_dict[i][str(k)] = j.count(k)
for i,j in count_dict.items():
print('{} has {}'.format(i,j))
Ответ №6:
Во-первых, вы действительно должны делать свою собственную домашнюю работу
… Мне просто нравится хорошая проблема с альго ( adventOfCode
, кто-нибудь?)
Шаги:
- не забывайте
"
о строках в списке - создайте словарь для хранения значений внутри
"a"
и"b"
- повторите списки в индексах 1-n
- получите ведро a/b из:
l[0][sublist_index - 1]
- начните подсчет значений, если они еще не подсчитаны:
if v not in d[bucket].keys(): d[bucket][v] = 0
- увеличьте счетчик для
v
, в соответствующем ведре:d[bucket][v] = 1
- получите ведро a/b из:
l = [["a","a","b","a","b","b","b"],[5,5,4,5],[5,1,5],[2,5],[4,5],[5],[3],[5]]
d = {"a": {}, "b": {}}
for sublist_index in range(1, len(l)):
bucket = l[0][sublist_index - 1]
for v in l[sublist_index]:
if v not in d[bucket].keys():
d[bucket][v] = 0
d[bucket][v] = 1
print(d)
и результат:
{'a': {5: 6, 4: 2, 1: 1}, 'b': {2: 1, 5: 3, 3: 1}}
Комментарии:
1. Этот код выдает ошибку индекса как есть, а при исправлении дает неправильный ответ к вашему сведению.
2. чертовы индексы один за другим! исправил это, перечитал проблему еще раз и тоже исправил 🙏