这个数据结构的嗯,列表,元组,数组,集合或词组?

时间:2011-12-02 13:19:23

标签: python list variables

初学者程序员在这里。在阅读了一些关于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

的全部内容

3 个答案:

答案 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()的布尔参数。