Привет, дорогие программисты,
Я хочу найти определенные слова в элементах списка. Мой ввод выглядит следующим образом:
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen'...]
Я хочу найти и считать \tNN\t или\tADJ\t или \tVFIN\t. Позиция слов, которые я хочу считать, всегда одна и та же, как вы можете видеть в примере.
Я пробовал следующий код, но я получаю следующую ошибку: ValueError слишком много значений для распаковки (ожидается 3)
from collections import Counter
myInputList = Counter([b for a,b,c in myInputList])
print(myInputList)
На самом деле, я вижу, почему этот код не работает. Но у меня нет другого подхода.
Поэтому моя цель - подсчитать теги "Часть тегов", которые находятся между \t. Поэтому в конце я хочу сказать: есть 5 NN, 4 ADJA...
Включая случай, когда '\ t' не присутствует
from collections import Counter
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen','xyz']
Counter([x.split('\t')[1] for x in myInputList if '\t' in x])
Преобразование в словарь
from collections import Counter
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen','xyz']
d=dict(Counter([x.split('\t')[1] for x in myInputList if '\t' in x]))
print(d['NN'])
Выход: 1
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
newList = []
for i in myInputList:
newList.extend(i.split("\t"))
from collections import Counter
Counter(newList)
дает
{'ADJ': 1,
'Haus': 1,
'Hauses': 1,
'NN': 1,
'VFIN': 1,
'gehen': 1,
'geht': 1,
'gut': 1,
'guten': 1}
Если вы хотите, и вы уверены, что хотите только элементы в индексе 2ND, то вы можете просто сделать
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
newList = []
for i in myInputList:
newList.append(i.split("\t"))
from collections import Counter
onlySecond = [i[1] for i in newList]
dict(Counter(onlySecond))
дам тебе
{'ADJ': 1, 'NN': 1, 'VFIN': 1}
Вы можете использовать collections.defaultdict
. Если в элементе списка имеется более одного значения, вы можете удалить break
, который в противном случае останавливается при первом совпадении для определенной строки.
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
values = ['\tNN\t', '\tADJ\t', '\tVFIN\t']
from collections import defaultdict
d = defaultdict(int)
for item in myInputList:
for v in values:
if v in item:
d[v] += 1
break
print(d)
defaultdict(int, {'\tADJ\t': 1, '\tNN\t': 1, '\tVFIN\t': 1})
Это должно сделать это:
a, b, c = ('\tNN\t', '\tADJ\t', '\tVFIN\t')
myInputList = ['Hauses\tNN\tHaus', 'guten\tADJ\tgut', 'geht\tVFIN\tgehen']
print(len([i for i in myInputList if any(j in i for j in [a, b, c])]))
#3
print(len([i for i in myInputList if any(j in i for j in [a])]))
потому что ... for j in a
разбиении a разбивается на ['\t', 'N', 'N', '\t']
split
строки на\t
.Counter(s.split('\t')[1] for s in myInputList)