1

嘿,我正在编写一个程序,它从 Scratch 接收广播,然后根据广播确定从哪里继续。该代码将广播(列表项)转换为字符串,然后使用 .split() 将该字符串分解为列表。唯一的问题是广播可能只有 1 个词而不是 2 个。有没有办法检查 .split() 中的列表项之一是否为空,然后将其更改为占位符值?

我遇到麻烦的地方

scratchbroadcast =  str(msg[1])

    BroadcastList = scratchbroadcast.split()

    #starts the switch statement that interprets the message and proceeds
    #to the appropriate action
    v = BroadcastList[0]
    w = BroadcastList[1]
    if BroadcastList[1] == '':
        w = "na"
4

2 回答 2

0

好的,首先考虑这个:第三项怎么样?还是第四个?还是四十秒?

如果字符串不包含分隔符(例如空格),您将不会得到一个包含两个项目的列表,其中一个是空白的——您最终会得到一个只有一个项目的列表。

在 Python 中,一般通过内置len()函数获取某物的长度:

len([])              # == 0
len(["foo"])         # == 1
len(["foo", "bar"])  # == 2

因此,你会这样做:

if len(broadcast_list) == 1:
    broadcast_list += [""]

做同样事情的其他方法包括broadcast_list.append("")broadcast_list.extend([""])。使用哪一个完全取决于您;+=并且.extend或多或少等效,而.append只能添加一个元素。

查看您的其余代码,您的case调用不会像您期望的那样工作:在 Python 中,字符串是真实的,因此'string' or 'otherString'True or True. or严格来说是一个布尔运算符,您不能将它用于“这个或那个”。

Python 因没有 switch 语句而臭名昭著。如果你经历过它,你实现一个的尝试实际上会有点可爱——这样的事情在 Python OOP 中可能是一个很好的练习,并将函数作为一等对象传递。(在我日常使用 Python 的过程中,我几乎不需要做类似的事情,但将它包含在您的概念工具包中真是太好了。)

你可能会很高兴得知 Python 字符串有一个lower方法。有了它,您的代码最终会看起来像这样:

v = broadcast_list[0].lower()
if v == 'pilight':
    # ...
else if v == 'motor':
    # ...
else if v == 'camera':
    # ....

附带说明一下,您可能想看看PEP8,它是格式化 Python 代码的事实上的标准。如果您希望其他人能够快速找出您的代码,您应该至少符合其最基本的命题 - 例如 CamelCased 的类和小写的变量,而不是相反。

于 2014-07-02T17:21:40.750 回答
0

如果BroadcastList只包含一个单词,那么BroadcastList将是一个单元素列表,例如

>>> "foo".split()
['foo']

显然我们无法检查列表中的第二项是否为空字符串''没有第二个元素。相反,检查列表的长度

w = "na" if len(BroadcastList) == 1 else BroadcastList[1]

或者,使用try来捕捉IndexError请求宽恕比许可更容易):

try:
    w = BroadcastList[1]
except IndexError:
    w = "na"
于 2014-07-02T17:17:27.327 回答