Python Find & Count Определенное слово в элементах списка (Strings)

1

Привет, дорогие программисты,

Я хочу найти определенные слова в элементах списка. Мой ввод выглядит следующим образом:

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

  • 0
    split строки на \t . Counter(s.split('\t')[1] for s in myInputList)
Теги:
list
search
count
word

4 ответа

0
Лучший ответ

Включая случай, когда '\ 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

  • 0
    Спасибо! Это работает! :-) И еще один вопрос: теперь я хотел бы посчитать только NN и получить в качестве результата только номер, больше ничего. как: 1
  • 0
    Счетчик имеет структуру, аналогичную структуре словаря. Обновил мой код. Надеюсь, это поможет.
Показать ещё 1 комментарий
0
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}
0

Вы можете использовать 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})
0

Это должно сделать это:

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
  • 0
    Спасибо. Ваш код работает. Но я попытался немного его изменить, чтобы, например, подсчитать только NN. Вы понимаете, почему моя ошибка? Я сделал это так: a = ('\ tNN \ t') myInputList = ['Hauses \ tNN \ tHaus', 'guten \ tADJ \ tgut', 'geht \ tVFIN \ tgehen'] print (len ([i для я в myInputList if (j в i для j в a)])) # я получаю 3 как результат # но я должен получить 1 как результат
  • 0
    @AnnaLise Как я и предлагал при редактировании, используйте 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']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню