Python 2.7 返回满足特定条件的项目列表的更好方法,而不是+=
请原谅我的无知,但我对python还是新手。 我正在尝试在Python2.7中修改一个转换器,我发现要使一些函数按我喜欢的方式工作非常困难,因此非常感谢您的帮助。 我有这些特定的代码部分Python 2.7 返回满足特定条件的项目列表的更好方法,而不是+=,python-2.7,formatting,converter,Python 2.7,Formatting,Converter,请原谅我的无知,但我对python还是新手。 我正在尝试在Python2.7中修改一个转换器,我发现要使一些函数按我喜欢的方式工作非常困难,因此非常感谢您的帮助。 我有这些特定的代码部分 def int2hex(self, int): return ("%x" % int) def Caids(self): caids = "" service = self.source.service if service: info = se
def int2hex(self, int):
return ("%x" % int)
def Caids(self):
caids = ""
service = self.source.service
if service:
info = service and service.info()
if info:
caids = list(set(info.getInfoObject(iServiceInformation.sCAIDs)))
return caids
def CaidList(self):
caids = self.Caids()
caidlist = ""
if caids:
for caid in caids:
caid = self.int2hex(caid).upper().zfill(4)
if (len(caids) > 1):
caidlist = ", ".join("{:04x}".format(x) for x in caids).upper()
else:
caidlist += caid
return caidlist
在上面的代码中,我成功地创建了一个十六进制列表字符串,其中包含了特定元素(CAID)和list(set(info.getInfoObject(iServiceInformation.sCAIDs)),并删除了重复项。然后我获取每个caid,将其转换为十六进制,并返回一个新的caidlist,其中包含相同的元素,用逗号和空格分隔。到目前为止一切都很好。结果是一个十六进制数列表,如0500、0502、0100、0D07等。
当我想通过满足某些条件将每个caid转换为文本元素时,问题就出现了
我在前面的代码之后编写了以下代码:
def CaidTxtList(self):
caids = self.Caids()
caidtxt = ""
if caids:
for caid in caids:
caid = self.int2hex(caid).upper().zfill(4)
if str(caid).startswith("01"):
caid = "Seca"
if str(caid).startswith("05"):
caid = "Viaccess"
if str(caid).startswith("06"):
caid = "Irdeto"
if str(caid).startswith("0D"):
caid = "CryptoWorks"
caidtxt += caid
caidtxt += " "
return caidtxt
在上面的代码中,我成功地将每个caid转换为等效的文本。结果是一个对应于每个十六进制caid的单词字符串,但我还没有获得join命令的结构,就像它们的十六进制等价物一样,就像CaidList部分一样
使用caidText+=caid,我得到的是Viaccess、Viaccess、Seca、CryptoWorks(空白)
我努力实现的目标是:
我知道我离得很近,我觉得自己很愚蠢,因为我不知道该如何走得更远。我看过很多文档和例子,但我尝试过的一切都失败了。因此,如果有任何方法来实现我喜欢的格式,请帮助我 我很想帮忙,但我很难通过模拟输入和输出来复制您的结果。。将
caids=self.caids()
替换为示例列表caids=[0x1811、0x0500、0x0D07]
通过访问0D07打印1811,但这似乎没有用。知道我们如何重现您的结果吗?第一个命令caids=list(set(info.getInfoObject(iServiceInformation.sCAIDs)))它所做的是读取加密卫星频道的caid,将它们放入列表并删除重复项。这些CAID是十进制数字形式。例如,如果服务有三个不同的CAID(比如Viaccess、Seca、Nagravision),则字符串将为1280 256 3479。这就是self.Caids()所做的。现在我想要这个十六进制的列表,没有0x。因此,我使用def int2hex将列表中的每个caid转换为等价的0500 0100 0D97。在def CaidList()函数中,我将其转换为我喜欢的格式,即所需的格式0500、0100、0D97。这很好。如果我想重复这个函数,事情会变得复杂,但不是0500、0100、0D97来生成文本字符串Viaccess、Seca、Nagravision。使用+=命令我可以这样做,但格式不是我想要的,它返回Seca、Viaccess、Nagravision(空白)。等价物使用代码的if部分进行转换。startswith(“05”)将从05开始的所有内容转换为Viaccess,依此类推。但如果我有两个以05开头的CAID,它将两次显示Viaccess。我想将其唯一化。我尝试加入并设置,但失败了。随着设置,字母似乎混淆了。使用join时,我根本无法返回CAID,因为我不知道如何创建caidlist以将其输入join函数。感谢您的进一步解释,但您是否可以创建一个?我很想提供帮助,但我很难通过模拟输入和输出来复制您的结果。。将caids=self.caids()
替换为示例列表caids=[0x1811、0x0500、0x0D07]
通过访问0D07打印1811,但这似乎没有用。知道我们如何重现您的结果吗?第一个命令caids=list(set(info.getInfoObject(iServiceInformation.sCAIDs)))它所做的是读取加密卫星频道的caid,将它们放入列表并删除重复项。这些CAID是十进制数字形式。例如,如果服务有三个不同的CAID(比如Viaccess、Seca、Nagravision),则字符串将为1280 256 3479。这就是self.Caids()所做的。现在我想要这个十六进制的列表,没有0x。因此,我使用def int2hex将列表中的每个caid转换为等价的0500 0100 0D97。在def CaidList()函数中,我将其转换为我喜欢的格式,即所需的格式0500、0100、0D97。这很好。如果我想重复这个函数,事情会变得复杂,但不是0500、0100、0D97来生成文本字符串Viaccess、Seca、Nagravision。使用+=命令我可以这样做,但格式不是我想要的,它返回Seca、Viaccess、Nagravision(空白)。等价物使用代码的if部分进行转换。startswith(“05”)将从05开始的所有内容转换为Viaccess,依此类推。但如果我有两个以05开头的CAID,它将两次显示Viaccess。我想将其唯一化。我尝试加入并设置,但失败了。随着设置,字母似乎混淆了。使用join时,我根本无法返回CAID,因为我不知道如何创建caidlist,以便在join函数中输入它。感谢您的进一步解释,但是您是否可以创建一个caidlist?