Хорошо, поэтому я немного поработал над этим, я все еще получаю свои отбивные с питоном, и на данный момент это кажется мне недоступным. У меня есть список кортежей и простой старый список (может быть неправильным в отношении точной терминологии, если да, пожалуйста, дайте мне знать, как правильно это указать. Мне нравится учиться). Я пытаюсь сравнить значение в каждом кортеже со значениями в списке и вернуть все уникальные кортежи. Так вот мой код (модифицированный, как некоторые это внутренний тип материал):Сравнить Список с кортежами против списка и возвращать уникальные кортежи
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)]
Мне также нужно отбросить их от ожидаемого результата. Может ли кто-то предоставить решение, которое включает первый выпуск и эту проблему?
Трудно понять, что именно вы пытаетесь сделать. Может быть, вы могли бы опубликовать гораздо более простой пример проблемы, которую вы пытаетесь решить? Из-за всех ABC-подобных строк трудно сразу понять, что вы [хотите] сделать. –
Можете ли вы уточнить тестовый кортеж против списка, который хотите сделать? Что для вас уникально?Просто забудьте о том, как вы создаете свой список и кортежи - можете ли вы привести пример с простыми и легкими значениями? – xph
Помогает ли @TomDalton и @xph? – beardedeagle