2015-01-20 3 views
1

Проверить ниже для лучшего объяснения У меня есть длинный список элементов в файле, который читается по строкам, и я хочу сортировать все, что имеет определенную строку в нем. Если слово не содержит каких-либо элементов в сортировке, оно будет добавлено в словарь. Как мне это сделать? Я прочитал некоторые другие ситуации на этом веб-сайте, но я просто не понимаю ... Так что это может быть дубликат, но мне нужно, чтобы кто-то объяснил мне, как это сделать. (да детали от игры TF2)Проверьте, содержит ли строка какие-либо элементы из списка

item_list = ("Non-Tradable Ubersaw", "Screamin' Eagle", "'Non-Craftable Spy-cicle" 

sort = ("Non-Tradable", "Non-Craftable") # The items that are not allowed 
for word in item_list: 
    if not sort in word: 
     if word in items: # add to the dictionary 
      items[word] += 1 
     else: 
      items[word] = 1 

уже получил это ответил, а просто сделать вопрос ясен. Я хочу запустить сортировать список: item_list и я хотел сделать это, сделав массив: рода поэтому он проверяет каждый элемент в item_list и проверить, если элемент имеет какие-либо элементы из рода в Это. Если бы он не добавил элемент в словарь.

ответ

5
>>> item_list = ["Non-Tradable Ubersaw", "Screamin' Eagle", "'Non-Craftable Spy-cicle"] 
>>> not_allowed = {"Non-Tradable", "Non-Craftable"} 

Вы можете использовать список понимание с any, чтобы проверить, если какие-либо из запрещенных подстрок в текущем элементе

>>> filtered = [i for i in item_list if not any(stop in i for stop in not_allowed)] 
>>> filtered 
["Screamin' Eagle"] 
+0

Зачем делать not_allowed набор? –

+0

@PadraicCunningham Поскольку все элементы уникальны (нет смысла проверять дважды, если существует дубликат), а операция 'in' выполняется быстрее для' set', чем 'list', если количество элементов становится большим. – CoryKramer

+0

, но вы не используете в себе, итерации по множеству? Если OP создает элементы фильтра, то не будет дубликатов –

1

Вы должны проверить каждый элемент рода не в каждом слове не сравнить кортеж каждое слово, которое является то, что if not sort in word делает:

from collections import defaultdict 

items = defaultdict(int) 
for word in item_list: 
    if not any(ele in word for ele in srt): 
     items[word] += 1 

Стоит добавить, как это на самом деле отвечает на вопрос, как просили. Как @JonClements предлагает просто использовать счетчик Dict:

from collections import Counter 
items = Counter(item for item in item_list if not any(word in item for word in sort)) 

с использованием defaultdict устраняет необходимость проверки if word in items.

+0

Почему нет: 'items = Счетчик (элемент для item в item_list, если нет (слово в элементе для слова в сортировке))'? –

+0

@JonClements, я просто собирался сделать что-то подобное, но на основании того факта, что принятый ответ OP на вопрос теперь не имеет смысла –

+0

Отлично работает, спасибо за ваш ответ :) – RasmusGP

0

Я знаю, вы используете питон, но если файл действительно огромная, хорошая оптимизация будет заключаться в использовании некоторых команд нижнего уровня, например bash. Подобно тому, как просто, как и однострочник:

$ grep "text you are searching" my_file.txt | sort 

Конечно, этот Баш код может быть выполнен из питона, если это необходимо, с помощью subprocess модуля.

Опять же, это стоит того, только если файл огромен, и оптимизация производительности имеет значение. Команды bash будут выполнять работу быстрее, чем простой цикл python.

Надеюсь, это поможет.

Смежные вопросы