python - 将列表与元组与列表进行比较并返回唯一的元组

标签 python list rest soap tuples

好吧,我已经研究了一会儿了,我仍然在使用 python,这似乎暂时超出了我的能力范围。我有一个元组列表和普通的旧列表(确切的术语可能是错误的,如果是这样,请让我知道如何正确地陈述它。我喜欢学习)。我试图将每个元组中的值与列表中的值进行比较,并返回所有唯一的元组。这是我的代码(由于其中一些是内部类型的内容而进行了修改):

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(限制输出,因为 apifiltered 中有近 3.8k 响应)

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

soapfiltered(限制输出,因为soapfiltered 中有大约 4k 响应)

[(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;): 我有一个 list :

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中删除任何元组,其中soapfiltered中每个元组的[1]值与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)]

另一次编辑:

@szabad 给出了一个很好的答案:

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

所以这很棒,但是有些元组中 tup[3] 不是“Live”,如下所示:

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

我也需要将这些从预期结果中删除。有人可以提供包含第一个问题和这个问题的解决方案吗?

最佳答案

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

关于python - 将列表与元组与列表进行比较并返回唯一的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29290874/

相关文章:

python - python中的并行处理

python - 如何转发/填充 Pandas DataFrame 列/系列中的特定值?

CSS 和 z-index : child element under parent element in a list

json - grails spring 安全休息状态 401 重定向到 Controller 的操作以抛出自定义错误消息

python - 基于 Pandas 数据框替换 numpy 二维数组中的值

python - 如何扩充 Tensorflow 数据集中的数据?

python - 如何使用迭代器将 lambda 函数列表应用于单个元素?

python - 在 Django 中为多个查询编写 View 的最佳方法?

http - REST 服务器对授权的响应

database - 502 是数据库错误的适当状态代码吗?