2015-03-26 3 views
1

Хорошо, поэтому я немного поработал над этим, я все еще получаю свои отбивные с питоном, и на данный момент это кажется мне недоступным. У меня есть список кортежей и простой старый список (может быть неправильным в отношении точной терминологии, если да, пожалуйста, дайте мне знать, как правильно это указать. Мне нравится учиться). Я пытаюсь сравнить значение в каждом кортеже со значениями в списке и вернуть все уникальные кортежи. Так вот мой код (модифицированный, как некоторые это внутренний тип материал):Сравнить Список с кортежами против списка и возвращать уникальные кортежи

from suds.client import Client 
from suds.transport.https import WindowsHttpAuthenticated 
import requests, base64 


soapurl = 'soapurl' 
username = base64.b64decode('base64codehere').split(':')[0] 
password = base64.b64decode('base64codehere').split(':')[1] 
apiuser = base64.b64decode('differentbase64codehere').split(':')[0] 
apipass = base64.b64decode('differentbase64codehere').split(':')[1] 
ntlm = WindowsHttpAuthenticated(username=username, password=password) 
client = Client(soapurl, transport=ntlm) 
result = client.service.method(serverName='a1bcefg') 
soapfiltered = [] 
for item in result[0]: 
    soapfiltered.extend(list(item[i] for i in [0, 1, 6, 7])) 
soapfiltered = zip(*[iter(soapfiltered)]*4) 
apifiltered = [] 
for i in range(0, 11000, 1000): 
    apiUrl = 'apiurl/?sort=id&limit=0&offset=' + str(i) +'&order=desc' 
    apiData = requests.get(apiUrl, verify=False, auth=(apiuser, apipass)).json() 
    for response in apiData['data']: 
     apifiltered.append(str(response['hostname'])) 

Который в основном дает мне это:

apifiltered (ограничение выхода, как есть почти 3.8k réponse в apifiltered)

['A1BCEFG001', 'A1BCEFG339', 'A1BCEFGDED444', 'A1BCEFG343', 'A1BCEFG2700', 'A1BCEFG1133', 'A1BCEFGDED321', 'A1BCEFG347', 'A1BCEFG371', 'A1BCEFG373'] 

и

soapfiltered (ограничение выхода, как есть о 4k в ответ soapfiltered)

[(63258, A1BCEFG001, A5001195, Live), (63259, A1BCEFGDED444, A5001196, Live), (63260, A1BCEFGDED321, A5001194, Live), (63261, A1BCEFGDED2743, A5001199, Live), (63262, A1BCEFG339, A5001193, Live), (63263, A1BCEFGDED2745, A5001197, Live), (63264, A1BCEFGDED2746, A5001206, Live), (63265, A1BCEFGDED2747, A5001202, Live), (63266, A1BCEFGDED2748, A5001205, Live), (63387, A1BCEFG1193, A5004312, Live)] 

Так что я пытаюсь сделать, если это вообще возможно, что-то вроде этого:

[(63261, A1BCEFGDED2743, A5001199, Live), (63263, A1BCEFGDED2745, A5001197, Live), (63264, A1BCEFGDED2746, A5001206, Live), (63265, A1BCEFGDED2747, A5001202, Live), (63266, A1BCEFGDED2748, A5001205, Live), (63387, A1BCEFG1193, A5004312, Live)] 

Я посмотрел на другие решения, но я не могу показаться, чтобы получить результаты, которые я ищу. Любая помощь будет оценена, поскольку я продолжаю работать над этим с моей стороны. Если есть какая-либо дополнительная информация, пожалуйста, спросите, и я предоставлю все, что смогу. Спасибо.

редактирования.К РАЗЪЯСНЕНИИ (TLDR;): У меня есть список:

apifiltered = ['A1BCEFG001', 'A1BCEFG339', 'A1BCEFGDED444', 'A1BCEFG343', 'A1BCEFG2700', 'A1BCEFG1133', 'A1BCEFGDED321', 'A1BCEFG347', 'A1BCEFG371', 'A1BCEFG373'] 

И список кортежей:

soapfiltered = [(63258, A1BCEFG001, A5001195, Live), (63259, A1BCEFGDED444, A5001196, Live), (63260, A1BCEFGDED321, A5001194, Live), (63261, A1BCEFGDED2743, A5001199, Live), (63262, A1BCEFG339, A5001193, Live), (63263, A1BCEFGDED2745, A5001197, Live), (63264, A1BCEFGDED2746, A5001206, Live), (63265, A1BCEFGDED2747, A5001202, Live), (63266, A1BCEFGDED2748, A5001205, Live), (63387, A1BCEFG1193, A5004312, Live)] 

Я хочу сравнить soapfiltered против apifiltered и удалите из кортежей от soapfiltered, где значение [1] из каждого кортежа в soapfiltered соответствует значению, найденному в apifiltered.

Ожидаемый результат:

expected = [(63261, A1BCEFGDED2743, A5001199, Live), (63263, A1BCEFGDED2745, A5001197, Live), (63264, A1BCEFGDED2746, A5001206, Live), (63265, A1BCEFGDED2747, A5001202, Live), (63266, A1BCEFGDED2748, A5001205, Live), (63387, A1BCEFG1193, A5004312, Live)] 

ОЧЕРЕДНОЙ EDIT:

@szabad дал большой ответ:

expected = [tup for tup in smdbfiltered if tup[1] not in apifiltered] 

Так это работает удивительным, но есть кортежи, где стро [ 3] - это нечто иное, чем «Живое», как показано ниже:

[(56536, A1BCEFG744-r, Retired, Prod 1CP)] 

Мне также нужно отбросить их от ожидаемого результата. Может ли кто-то предоставить решение, которое включает первый выпуск и эту проблему?

+0

Трудно понять, что именно вы пытаетесь сделать. Может быть, вы могли бы опубликовать гораздо более простой пример проблемы, которую вы пытаетесь решить? Из-за всех ABC-подобных строк трудно сразу понять, что вы [хотите] сделать. –

+0

Можете ли вы уточнить тестовый кортеж против списка, который хотите сделать? Что для вас уникально?Просто забудьте о том, как вы создаете свой список и кортежи - можете ли вы привести пример с простыми и легкими значениями? – xph

+0

Помогает ли @TomDalton и @xph? – beardedeagle

ответ

1
filtered = [tup for tup in soapfiltered if tup[3] == 'Live' and tup[1] not in apifiltered] 
+0

И у нас есть победитель. Большое вам спасибо, я ценю это больше, чем вы можете знать. Оставайся золотым. – beardedeagle

+0

Добро пожаловать. Хороший. –

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