如何在Python中创建由多个列表元素组成的主列表?

2024-09-27 17:30:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码应该做的是,运行一个文本文件(我用linenum作为键存储在dict中),然后在每一行中搜索Lwordli中的一个单词。如果程序找到了这个单词,那么就遍历存储在my MasterLi中的不同列表,以确定该句子中的一个或多个其他单词是否与列表中的内容匹配。如果是,那么做condition,如果不是,则转到elif条件并检查另一个列表,等等。然后对txt中的每个句子都这样做。在

对于if-else语句,我需要将多个列表存储在1个主控形状中。我正在尝试这样的事情:

Li1 = []
Li2 = []

MasterLi = Li1, Li2

Lwordli = []

然后这是一个例子,说明它需要如何在我的代码中运行,我的一些实际代码正在返回一个错误,如果有人能想出比四个For循环更好的方法,那会很有帮助,但主要关注的是如何从Master调用单个列表:

^{pr2}$

回溯错误

    Traceback (most recent call last):
  File "C:/Users/Lewis Collins/PycharmProjects/Test/main.py", line 134, in <module>
    languagemodel()
  File "C:/Users/Lewis Collins/PycharmProjects/Test/main.py", line 94, in languagemodel
    cword) + r'\b.*' + re.escape(lword) + r'\b'
  File "C:\Users\Lewis Collins\AppData\Local\Programs\Python\Python35-32\lib\re.py", line 267, in escape
    return bytes(s)
TypeError: 'str' object cannot be interpreted as an integer

我相信这个错误是由于我试图将列表存储在主列表中而导致的,因为我的代码工作得很好,如果我尝试将for循环作为:

for word in Li1:

Tags: 代码inpy列表错误line单词users
2条回答

要创建包含所有列表元素的主列表,可以使用+运算符,即MasterLi = Li1 + Li2。您也可以通过使用列表的extend方法来实现这一点。 您当前的方法是创建一个列表元组,这似乎不是您所需要的。在

实际上,您的错误消息指出了调用re.escape()中的一个问题,该问题可能由cword或{}触发。我建议你重写这一部分:

pattern = r'\b' + re.escape(lword) + r'\b.*\b' + re.escape(cword) + r'\b|\b' + re.escape(
                cword) + r'\b.*' + re.escape(lword) + r'\b'

作为:

^{pr2}$

这并不能解决问题本身,但至少你会知道是什么触发了错误。在

另外,如果你所说的“主列表”是指两个列表的串联,那么它的拼写是master_list = list1 + list2。{cd6}是什么意思。在

最后,如果您只想测试一个给定的单词是否属于给定的列表,并根据该单词来自哪个列表分支,那么还有更好的选择。假设您的Li1Li2列表在循环过程中不会发生变化,那么最好使用一个迭代器来获取(,)对并生成(<identifier>,单词`)元组,即:

def chain(*args):
    for identifier, lst in *args:
        for word in lst:
            yield identifier, word

然后将for cword in MasterLi替换为:

for identifier, cword in chain(("l1", Li1), ("l2", Li2)):
    # various stuff here
    if identifier == "l1":
        # some processing here
    elif identifier == "l2":
        # some different processing here

等等,这将大大节省时间和空间(不需要建立一个巨大的“主列表”,无需进行无用的O(n)查找来找出给定单词来自哪个列表)。在

或者您可以在(<list>, <function>)对上的函数和链中封装“#some processing here”和“some different processing here”,即:

def handleLi1(...):
    # some processing here

def handleLi2(...):
    # some different processing here


def chain(*args):
    for lst, func in *args:
        for word in lst:
            yield word, func


for cword, func in chain((Li1, handleLi1), (Li2, handleLi2)):
    # various stuff here
    whatever = func(cword, whatever, arg, needed)

您只需要确保两个“handler”函数使用相同的参数(如果必须返回某些内容,则返回相同类型的值)

相关问题 更多 >

    热门问题