【问题标题】:Fixing a Dictionary Comprehension for a Nested For Loop修复嵌套 For 循环的字典理解
【发布时间】:2021-06-03 17:06:29
【问题描述】:

我正在学习理解,即列表理解和字典理解。我想使用更多的理解来扩展我的代码。现在,我正在尝试转换这种方法,“解析句子”,我作为网络抓取类的一部分编写,我想将其重写为字典理解。

def parse_sentences(text_str):
    """
    :param text_str: list of text that needs to be divided by periods
                    at end of sentence.
    :return: list of the individual sentences for every element
            of the list
    """
    # Define list to hold the individual sentences.
    split_text_strings = []
    
    # Loop through each element of the text.
    for i in text_str:
        split_i = i.split('.')
        for j in split_i:
            last = len(split_i) - 1
            if split_i[last] == '':
                split_i.pop(last)
            split_text_strings.append(j)
    
    return split_text_strings

基本上,它采用 ['This is a sentence.这是一个伟大的句子。','你没有听说过这句话吗?可能是我读过的最好的句子。'] 并返回另一个列表 split_text_strings ,其中每个元素都有一个句子。 ['这是一个句子','这是一个伟大的句子','你没听说过这句话','可能是我读过的最好的句子']。这是我将其转换为字典理解的尝试

def parse_sentences(text_str):
    """
    :param text_str: list of text that needs to be divided by periods
                    at end of sentence.
    :return: list of the individual sentences for every element
            of the list
    """
    split_text_strings = {(i, j): i.split('.') for i in text_str for j in text_str[text_str.index(i)]}
    return split_text_strings

我知道 '(i, j): i.split('.') for i in text_str' 是外循环,另一个 for 循环是内循环。但我不知道我做错了什么。

【问题讨论】:

  • 为什么要添加标签big-o?似乎是随机的。
  • 哦,因为大O不是和算法复杂度有关吗?我试图让我的算法更有效地运行,所以我开始研究 Big-0 符号和时间复杂度
  • Big-O 是关于算法复杂性的,但您的问题似乎不是。您对效率感兴趣这一事实并不会使这成为一个大问题。否则,Stack Overflow 上的几乎每个问题都会被标记。

标签: python list dictionary big-o


【解决方案1】:

什么不起作用? (1) 第一个函数返回一个列表,而第二个函数返回一个字典。注意函数的描述也是字典。 (2) 重复句子或旁边重复句子存在潜在问题。在第一种情况下,输入['I love StackOverflow.', 'I love StackOverflow'] 将被处理为['I love StackOverflow', 'I love StackOverflow'],但可能会导致字典理解的键重复。这会导致数据丢失。 (3) (i, j): i.split('.') for i in text_str for j in text_str[text_str.index(i)] 执行以下操作。说,text_str = ['b.c']。然后,i='b.c'j 首先迭代 'b.c',然后 j 取值 'b', '.', 'c'。那么,结果是

{
  ('b.c', 'b'): ['b', 'c'],
  ('b.c', '.'): ['b', 'c'],
  ('b.c', 'c'): ['b', 'c']
}

这不是你想要的。

你想做什么 我认为您希望密钥如下:text_str 中字符串的序号(应该称为text_arr,顺便说一句)和子字符串中句子的序号。例如,['a...', 'b.c'] 将表示为

{
  (0, 0): 'a',
  (1, 0): 'b',
  (1, 1): 'c'
}

在这种情况下,我们需要确定字符串的顺序。外循环是

(i, ?): ?? for i, string in enumerate(text_str)

我们马上填写问号。我们需要解析每个字符串,所以我们需要考虑string.split('.') 并遍历所有句子。这给了我们以下答案

(i, j): sentence for i, string in enumerate(text_str) for j, sentence in enumerate(string.split('.'))

最后,我们需要过滤掉空字符串如下:

(i, j): sentence for i, string in enumerate(text_str) for j, sentence in enumerate(string.split('.')) if sentence

【讨论】:

    【解决方案2】:

    当代码清楚地说两次列表时,不确定为什么要说字典。 无论如何,您始终可以使用列表推导。 for elem in text_str 是外循环,for segment in elem.split('.') 是内循环。如果有删除重复项等额外要求,可以考虑set

    split_text_strings = [segment for elem in text_str for segment in elem.split('.')]
    

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2016-06-08
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多