2015-11-24 5 views
1

Поэтому у меня есть список объектов SteamApp:Проверьте наличие определенного элемента в списке без Итерация или найти()

>>> games 
    [<SteamApp "Counter-Strike: Global Offensive" (730)>, <SteamApp "XCOM: Enemy Unknown" (200510)>] 

У меня тоже есть этот кусок кода:

ownscs = [] 

if '"Counter-Strike: Global Offensive"' in games: 
      print('Owns CS') 
      ownscs.append(foo) 

Все что я хочу сделайте, проверьте, владеет ли кто-то Counter-Strike , но вот суть игры, список игр не является итерируемым и не имеет атрибута find, в случае, если я попробую эти два, я получаю:

if any('"Counter-strike: Global Offensive"' in s for s in games): 
TypeError: argument of type 'SteamApp' is not iterable 

и

if games.find('"Counter-strike: Global Offensive"') != -1: 
AttributeError: 'SteamApp' object has no attribute 'find' 

Так что мой вопрос: как я проверить список игр для Counter-Strike: Global Offensive, когда это явно ни итерацию, ни обнаружимого.

Я использую https://github.com/smiley/steamapi, который создает объекты SteamApp, если вам интересно, что это такое.

+0

Вам необходимо знать атрибуты объекта steamapp. Попробуйте 'dir (steamapp)' – user193661

+0

Python 'list' _always_ iterable, так что это не ваша проблема. Тем не менее, ваша строка 'games = [...]' фактически не создает список. Вы пытались сказать нам, что список уже был инициализирован, чтобы содержать два объекта SteamApp? –

+0

@ KevinJ.Chase да, это было то, что я хотел сказать, даже не два, а больше! список содержит объект SteamApp для каждой игры. Ответ El'endia с картографированием сделал трюк! – Lyux

ответ

4

Вы пытаетесь найти str (строка) в списке объектов SteamApp. Эти SteamApp объектов на самом деле имеют определенный метод для использования с str(), так что этот код должен работать:

if "Counter-Strike: Global Offensive" in map(str,games): 
      print('Owns CS') 
      ownscs.append(foo) 

Обратите внимание, что я вынул одиночные кавычки (я думаю, что они не нужны) и изменили games к map(str,games). map применяет str к каждому пункту в games, который будет создавать ваш игровой список только с именами игр. Сделайте list(map(str,games)), чтобы увидеть, как выглядит этот список.

+2

О, боже, спасибо, это трюк, а также при взгляде на «список (карта (str, игры)).« Я наконец понял, как работает Mapping, большое спасибо! – Lyux

4

Даже несмотря на то другой ответ был уже принят, эта альтернатива немного больше Pythonic, а ближе к попытке плаката:

if 'Counter-strike: Global Offensive' in (s.name for s in games): 

Обратите внимание, что s.name имеет тот же результат, с этим классом, как str(s), но Я чувствую, что использование свойства name добавляет ясности.

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