【问题标题】:Compare List with tuples against list and return unique tuples将列表与元组与列表进行比较并返回唯一的元组
【发布时间】:2015-03-26 23:40:55
【问题描述】:

好的,所以我已经研究了一段时间,我仍然对 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;): 我有一个清单:

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)]

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

【问题讨论】:

  • 很难准确理解您要做什么。也许您可以发布一个更简单的示例来说明您要解决的问题?由于所有类似 ABC 的字符串,很难立即看到您 [想要] 做什么。
  • 您能澄清一下您想要创建的测试元组与列表吗?什么是你的“独特”?忘记你是如何建立你的列表和元组的——你能提供一个简单的例子吗?
  • 这对@TomDalton 和@xph 有帮助吗?
  • 如果我理解正确,这应该可以工作:soapfiltered = [tup for tup in soapfiltered if tup[1] not in apifiltered]。这个列表理解操作基本上会删除在apifiltered 列表中位置为 1 的所有元组。
  • @szabad 成功了。你是男人中的神。还有一种方法可以过滤掉任何不是 Live 的吗?一些元组将以 tup[3] 结尾,而不是“Live”,我也需要删除它们。再次感谢您迄今为止提供的帮助。

标签: python list rest soap tuples


【解决方案1】:
 filtered = [tup for tup in soapfiltered if tup[3] == 'Live' and tup[1] not in apifiltered]

【讨论】:

  • 我们有一个赢家。非常感谢,我感激不尽。保持金色。
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多