初学者程序员在这里。在阅读了一些关于python中不存在的'变量'后,(仍然没有得到)我认为我认为我应该在我的数据结构中使用列表,但我不完全确定。
即时分析包含要打印的命令和普通单词的字符串,如果单词是一个命令,在这种情况下前面带有'@',我希望它与实际单词在一个单独的列表中。然后我将处理所有这些以便打印出来,但我希望列表被排序,所以我可以浏览每个元素并测试它是否有一个单词,如果没有对命令做一些操作。
所以我真正想要的是一个带有两个索引的列表(谢谢!)(你怎么称呼它?) 像这样:
arglist[x][y]
所以我可以浏览arglist并处理它是否包含要打印的命令或单词。我希望arglist[x]
包含单词,arglist[y]
包含命令。
arglist = [] # not sure how to initialise this properly.
doh="my @command string is this bunch of words @blah with some commands contained in it"
for listindex, word in enumerate(doh):
if word.startswith('@'):
# its a command
arglist[listindex] = None
arglist[listindex][listindex]=command
else:
# its a normal word
arglist[listindex]=word
rglist[listindex][listindex]=None
然后我希望能够在列表中找到命令, 我想这会是这样的:
# get the number of items in the list and go through them...
for listindex, woo in enumerate(len(arglist)):
if arglist[listindex] is None:
# there is no word here, so print command
print arglist[listindex][listindex]
else:
# just print out word
print arglist[listindex]
所以:我的问题是我应该使用哪种数据类型/结构,我应该/我如何初始化它?我在这里咆哮着正确的树吗?
编辑:我刚发现这个宝石,现在我更加不确定 - 我希望它是我的数据可能的最快查找,但我仍然希望它被订购。
dict和set与列表和元组有根本的不同。它们存储密钥的哈希值,允许您快速查看项目是否在其中,但需要密钥可以清除。您没有使用链接列表或数组获得相同的成员资格测试速度。
非常感谢任何帮助。
编辑:例如我上面的字符串看起来应该是这样的。 doh =“我的@command字符串是@blah中含有一些命令的一堆字”
arglist[1] = 'my'
arglist[1][1] = None
arglist[2] = None
arglist[2][1] = command
arglist[3] = 'string'
arglist[3][1] = None
etc etc
这整件事给我留下了一点困惑,我会稍后再尝试更新。
编辑:如果有人想知道这是关于外观here
的全部内容答案 0 :(得分:2)
这里的问题是你误解了多维列表(数组)的概念。要注释您附加到问题的预期输出:
arglist[1] = 'my'
arglist[1][1] # equivalent to 'my'[1], so you get 'y'.
# and you cannot assign anything to arglist[1][1]
# because 'str' is immutable
arglist[2] = None
arglist[2][1] # invalid, because arglist[2] (None) is not subscriptable
如果您只想迭代单词并执行不同的操作,具体取决于它是一个命令(以@
开头)还是一个单词,那么您可以这样做:
for val in doh.split():
if val.startswith("@"): # this is a command
do_commandy_stuff(val)
else: # this is a word
do_wordy_stuff(val)
如果您想要的是能够使用和索引快速查找单词并确定它是否是命令,那么如何:
>>> lookup = [(w.startswith("@"), w) for w in doh.split()]
>>> lookup
[(False, 'my'), (True, '@command'), (False, 'string'), (False, 'is'), (False, 'this'), (False, 'bunch'), (False, 'of'), (False, 'words'), (True, '@blah'), (False, 'with'), (False, 'some'), (False, 'commands'), (False, 'contained'), (False, 'in'), (False, 'it')]
lookup
现在是list
的{{1}}。 tuple
中的第一个值表示它是否是命令,第二个值存储该词。
看起来很简单:
tuple
虽然这看起来更接近你想要实现的目标,但除非你需要大量随机访问单词,否则我看不到明显的好处。
答案 1 :(得分:1)
如果我猜你正在尝试做什么,你只需要两个清单。类似的东西:
>>> def separate_commands(sample):
... cmds, words = [], []
... for word in sample.split(' '):
... if word.startswith('@'):
... cmds.append(word)
... else:
... words.append(word)
... return cmds, words
...
>>> cmds, words = separate_commands("my @command string is this bunch of words @blah with some commands contained in it")
>>> print cmds
['@command', '@blah']
>>> print words
['my', 'string', 'is', 'this', 'bunch', 'of', 'words', 'with', 'some', 'commands', 'contained', 'in', 'it']
更新
>>> COMMANDS = dict(
... green = '^]GREEN;',
... brown = '^]BROWN;',
... blink = '^]BLINK;',
... reset = '^]RESET;',
... )
>>>
>>> def process_string(sample):
... ret = []
... for word in sample.split(' '):
... if word.startswith('@'):
... ret.append(COMMANDS.get(word[1:],'<UNKNOWN COMMAND>'))
... else:
... ret.append(word)
... return ' '.join(ret)
...
>>> print process_string("my @green string is this bunch of words @reset with some commands contained in it")
my ^]GREEN; string is this bunch of words ^]RESET; with some commands contained in it
答案 2 :(得分:1)
如果你需要保持订购,那么我建议使用一个tupes列表。下面的代码是一个生成器表达式,可用于生成列表或只处理一个
import re
from collections import OrderedDict
def parseCommand(in_string):
pieces = re.split(r'\B@.*?\b', in_string) # split across words beginning with '@'
if (not in_string.startswith("@")):
# First pieces element contains no command
else:
for piece in pieces:
command_parts = piece.split(None, 1)
yield (command_parts[0], command_parts[1].strip())
command_list = list(parseCommand("my @command string is this bunch of words @blah with some commands contained in it"))
此时最好的工具可能是有序的词典
commands = OrderedDict()
commands.update(command_list)
您可以通过名称从中获取单个命令:
blahcommand = commands['blah']
或者使用.popitem()
方法将其视为堆栈或队列(无论是堆栈还是队列取决于popitem()
的布尔参数。