嘿我正在编写一个程序,从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"
答案 0 :(得分:0)
如果BroadcastList
只包含一个字,那么BroadcastList
将是单个元素列表,例如
>>> "foo".split()
['foo']
显然,我们无法检查列表中的第二项是否为空字符串''
; 没有第二个元素。而是检查列表的长度:
w = "na" if len(BroadcastList) == 1 else BroadcastList[1]
或者,使用try
来抓住IndexError
(easier 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类和小写变量,而不是相反。