Python:列表项为空,代码检测是否为,然后放入占位符值?

时间:2014-07-02 16:51:19

标签: python list broadcast mit-scratch

嘿我正在编写一个程序,从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"

2 个答案:

答案 0 :(得分:0)

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

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

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

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

或者,使用try来抓住IndexErroreasier to ask for forgiveness than permission}:

try:
    w = BroadcastList[1]
except IndexError:
    w = "na"

答案 1 :(得分: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类和小写变量,而不是相反。