Как сравнить элемент кортежа (int), чтобы определить, существует ли он в списке - PullRequest
1 голос
/ 13 марта 2012

У меня есть два следующих списка:

# List of tuples representing the index of resources and their unique properties
#    Format of (ID,Name,Prefix)
resource_types=[('0','Group','0'),('1','User','1'),('2','Filter','2'),('3','Agent','3'),('4','Asset','4'),('5','Rule','5'),('6','KBase','6'),('7','Case','7'),('8','Note','8'),('9','Report','9'),('10','ArchivedReport',':'),('11','Scheduled Task',';'),('12','Profile','<'),('13','User Shared Accessible Group','='),('14','User Accessible Group','>'),('15','Database Table Schema','?'),('16','Unassigned Resources Group','@'),('17','File','A'),('18','Snapshot','B'),('19','Data Monitor','C'),('20','Viewer Configuration','D'),('21','Instrument','E'),('22','Dashboard','F'),('23','Destination','G'),('24','Active List','H'),('25','Virtual Root','I'),('26','Vulnerability','J'),('27','Search Group','K'),('28','Pattern','L'),('29','Zone','M'),('30','Asset Range','N'),('31','Asset Category','O'),('32','Partition','P'),('33','Active Channel','Q'),('34','Stage','R'),('35','Customer','S'),('36','Field','T'),('37','Field Set','U'),('38','Scanned Report','V'),('39','Location','W'),('40','Network','X'),('41','Focused Report','Y'),('42','Escalation Level','Z'),('43','Query','['),('44','Report Template ','\\'),('45','Session List',']'),('46','Trend','^'),('47','Package','_'),('48','RESERVED','`'),('49','PROJECT_TEMPLATE','a'),('50','Attachments','b'),('51','Query Viewer','c'),('52','Use Case','d'),('53','Integration Configuration','e'),('54','Integration Command f'),('55','Integration Target','g'),('56','Actor','h'),('57','Category Model','i'),('58','Permission','j')]

# This is a list of resource ID's that we do not want to reference directly, ever.
unwanted_resource_types=[0,1,3,10,11,12,13,14,15,16,18,20,21,23,25,27,28,32,35,38,41,47,48,49,50,57,58]

Я пытаюсь сравнить два, чтобы создать третий список, содержащий «Имя» каждого уникального типа ресурса, который в настоящее время существует в unwanted_resource_types. например Окончательный список результатов должен быть: result = ['Group','User','Agent','ArchivedReport','ScheduledTask','...','...']

Я пробовал следующее, что (я думал) должно работать:

result = []
for res in resource_types:
    if res[0] in unwanted_resource_types:
        result.append(res[1])

и когда это не удалось заполнить result Я также попытался:

result = []
for res in resource_types:
    for type in unwanted_resource_types:
        if res[0] == type:
            result.append(res[1])

также безрезультатно. Есть что-то, чего мне не хватает? Я полагаю, что это было бы подходящим местом для выполнения понимания списков, но это все еще находится в моей серой корзине полного понимания (документы Python для меня слишком лаконичны в данном случае).

Я также готов переосмыслить эту проблему, но мне нужно сохранить список кортежей, так как он используется в другом месте скрипта. Спасибо за любую помощь, которую вы можете оказать.

Ответы [ 4 ]

4 голосов
/ 13 марта 2012

В ваших типах ресурсов используются строки, а в ваших нежелательных ресурсах используются целые числа, поэтому вам потребуется выполнить некоторое преобразование, чтобы оно заработало.

Попробуйте сделать следующее:

result = []
for res in resource_types:
    if int(res[0]) in unwanted_resource_types:
        result.append(res[1])

или используя понимание списка:

result = [item[1] for item in resource_types if int(item[0]) in unwanted_resource_types]
1 голос
/ 13 марта 2012

Однострочник:

result = map(lambda x: dict(map(lambda a: (int(a[0]), a[1]), resource_types))[x], unwanted_resource_types)

без какого-либо явного цикла делает работу.

Хорошо - вы не хотите использовать это в рабочем коде - но это весело.; -)

Комментарий: внутренний dict (map (lambda a: (int (a [0]), a [1]), resource_types)) создает словарь из входных данныхданные:

{0: 'Group', 1: 'User', 2: 'Filter', 3: 'Agent', ...

Внешняя карта выбирает имена из словаря.

1 голос
/ 13 марта 2012

Числа в resource_types являются числами, содержащимися в строках, тогда как числа в unwanted_resource_types являются простыми числами, поэтому сравнение не выполняется. Это должно работать:

result = []
for res in resource_types:
    if int( res[0] ) in unwanted_resource_types:
        result.append(res[1])
1 голос
/ 13 марта 2012

Проблема состоит в том, что ваши тройки содержат строки, а нежелательные ресурсы содержат числа, измените данные на

resource_types=[(0,'Group','0'), ...

или используйте int() для преобразования строк в целые числа перед сравнением, и это должно работать.Ваш результат может быть вычислен с использованием списка, как в

result=[rt[1] for rt in resource_types if int(rt[0]) in unwanted_resource_types]

Если вы измените ('0', ...) на (0, ..., вы можете пропустить вызов int().

Кроме того, вы можетезамените переменную unwanted_resource_types на set, например

unwanted_resource_types=set([0,1,3, ... ])

, чтобы улучшить скорость (если скорость является проблемой, иначе это неважно).

...