需要帮助将函数应用于python中的列表列表吗

需要帮助将函数应用于python中的列表列表吗,python,Python,我在一个列表中有326个文本文档,它们是以逗号分隔的字符串。我想把它们分成几个句子,这样我就可以通过经过训练的机器学习模型来运行它们。通常我用句子而不是文档来工作,所以我有点迷路了。我从时段分割开始(列表的名称仅为“\u 10ks”\u by“\u ticker”): 它似乎已经奏效了,现在在列表中,每个文档都有一个列表,其中包含一系列句子。但是,我不知道现在如何将函数应用于每个句子,然后保留列表的结构。我可以将每个文档中的所有句子组合成一个大列表,但我想知道哪些句子是326个文档中哪个文档的一

我在一个列表中有326个文本文档,它们是以逗号分隔的字符串。我想把它们分成几个句子,这样我就可以通过经过训练的机器学习模型来运行它们。通常我用句子而不是文档来工作,所以我有点迷路了。我从时段分割开始(列表的名称仅为“\u 10ks”\u by“\u ticker”):

它似乎已经奏效了,现在在列表中,每个文档都有一个列表,其中包含一系列句子。但是,我不知道现在如何将函数应用于每个句子,然后保留列表的结构。我可以将每个文档中的所有句子组合成一个大列表,但我想知道哪些句子是326个文档中哪个文档的一部分。以下是我尝试的(preprocess是我要应用于每个句子的函数名):

这样做有效,但会将所有句子放在一个大列表中,从而丢失哪些句子在哪些文档中的信息。 我也试过:

tokenized_10k_2_attempt3 = []

for i, document in enumerate(only_10ks_by_ticker):
    for sentence in document:
        tokenized_10k_2_attempt3[i].append(preprocess(sentence))
但是有一个索引错误。谢谢你的帮助

编辑:我还尝试更改原始列表:

for i, document in enumerate(only_10ks_by_ticker):

    for j, sentence in enumerate(document):
        only_10ks_by_ticker[i][j] = preprocess(sentence)
还是不行

编辑2:如果每个人都需要这些信息,结果证明解决方案比我想象的要简单得多。我只需要列表comp中的另一组括号来保持原始结构:

tokenized_10k_22 = [[preprocess(sentence) for sentence in document] for document in only_10ks_by_ticker]
根据tqdm库,运行此函数所用的时间与下面给出的函数方法所用的时间基本相同,所以我猜它们的工作原理基本相同


再次感谢大家,我学到了很多关于嵌入式数据结构以及如何处理它们的知识:)

通过索引2N数组的两个维度,您可以简单地获得它的一个元素:
a[I][j]
。在您的情况下,
只能通过i][j]
访问每个句子,i和j是有效的整数索引

对于您的示例,可以使用两个嵌套循环:

for doc in only_10ks_by_ticker:
    for sentence in doc:
        # do anything to sentence here. It's string by the way.
您还可以使用
范围
编制索引:

for i in range(len(only_10ks_by_ticker)):
    for sentence in only_10ks_by_ticker[i]:
        tokenized_10k_2_attempt[i].append(preprocess(sentence))

也许我不理解????

希望我已经理解了您列表上的结构(参见我的示例文档列表)。 我的
mymethod
将等同于您的
preprocess
方法

def mymethod(str):
  return str.upper();


doc_list = [
  "document one. sentence one, ",
  "document two. sentence two",
  "document three. sentence three"
]
new_doc = ['.'.join([mymethod(sent) for sent in x.split('.')]) for x in doc_list]

import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(new_doc)
因此,代码首先在列表中迭代,然后按句点字符分割每个项目,将其发送到
mymethod
函数并放入新列表中;然后将该列表连接到一个由相同字符(句点)分隔的字符串中,并最终将其放入要发回的最终列表中

这是我的结果:

[   'DOCUMENT ONE. SENTENCE ONE, ',    'DOCUMENT TWO. SENTENCE TWO',    'DOCUMENT THREE. SENTENCE THREE']

希望是你所需要的

发生索引错误是因为您的列表是空的
tokenized_10k_2_attempt3
我应该如何填充它,以便列表
tokenized_10k_2_attempt3
与原始列表类似,但每个句子都应用了函数?谢谢为什么你不复制你的
only\u 10ks\u by\u ticker
only\u 10ks\u by\u ticker\u copy
,那么你可以做
only\u 10ks\u by\u ticker\u copy=[函数(elem)for elem in only\u 10ks\u by\u ticker\u copy]
其中
函数
是一个输入为列表(句子列表)的函数????。也许我不理解整个问题好吧,假设我不介意修改原始列表而不是创建新列表。代码是什么?我在上面的编辑中尝试了这段代码,但即使我没有创建一个新的列表,它仍然不起作用。你看到我在下面做的答案了吗?是的,这就是我在上面做的(在代码片段中)。我在访问这些句子时没有问题,问题是将它们返回到原始形式(每个文档中的句子与其他文档中的句子分开)。我想将该函数应用于文档列表中的每个句子,并创建一个与旧列表结构相同的新列表。@NorePatel我不知道是否得到它,但请尝试我在“编辑”中编写的第二个嵌套循环。如果不是你的解决方案,试着更清楚地解释你的问题。这很有效!非常感谢:)您能解释一下什么时候使用函数而不是使用循环来实现这一点吗?我一直在尝试无数的嵌入式循环和列表理解来实现这一点。我从未想过要构建另一个函数。另外,preprocess_document函数中的(document:list)参数意味着什么?我以前在函数的参数中没有看到冒号。谢谢@我没有写答案,但我仍然可以尝试回答你的问题!函数可以做很多事情,而仅仅通过列表理解是不可能的,因此这是一种前者优于后者的情况。在这种情况下,OP可能是为了清晰易读而创建了一个函数。至于冒号,它表示一个.Ah好的,那么类型注释/提示没有限制参数文档的类型,只是给它一个提示?换句话说,如果它只是
def preprocess\u document(document)
,它还能正常工作吗?另外,您是否有任何教程或文章可以解释函数可以为循环和列表comp做的一些事情?我觉得自从我开始编程以来,我知道很多东西,但永远不知道什么时候应用lol。谢谢!这可能也会奏效。我刚刚意识到可以在列表中使用多个括号来保持原始结构。但是有一个问题,为什么在.join()方法之前是“.”而不是像这样的中间空格“”?这就是我通常注意到的join方法。谢谢嘿,谢谢你的回复,它帮助我意识到我在我的原始列表comp中缺少了一组括号,而且效果很好(在文档部分的for语句周围需要另一组括号,你可以在编辑2中查看我在原始帖子中的意思)。再次感谢!:)
def preprocess_document(document: list):
    document = [preprocess(sentence) for sentence in document]
    return document

tokenized_10k_2_attempt3 = [preprocess_document(document) for document in only_10ks_by_ticker]

def mymethod(str):
  return str.upper();


doc_list = [
  "document one. sentence one, ",
  "document two. sentence two",
  "document three. sentence three"
]
new_doc = ['.'.join([mymethod(sent) for sent in x.split('.')]) for x in doc_list]

import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(new_doc)
[   'DOCUMENT ONE. SENTENCE ONE, ',    'DOCUMENT TWO. SENTENCE TWO',    'DOCUMENT THREE. SENTENCE THREE']