当前位置: 首页 > 知识库问答 >
问题:

在python中连接列表中元组的元素[重复]

咸承教
2023-03-14

我有一个包含字符串的元组列表,例如:

[('this', 'is', 'a', 'foo', 'bar', 'sentences')
('is', 'a', 'foo', 'bar', 'sentences', 'and')
('a', 'foo', 'bar', 'sentences', 'and', 'i')
('foo', 'bar', 'sentences', 'and', 'i', 'want')
('bar', 'sentences', 'and', 'i', 'want', 'to')
('sentences', 'and', 'i', 'want', 'to', 'ngramize')
('and', 'i', 'want', 'to', 'ngramize', 'it')]

现在我希望将每个字符串连接在一个元组中以创建一个以空格分隔的字符串列表。我使用了以下方法:

NewData=[]
for grams in sixgrams:
       NewData.append( (''.join([w+' ' for w in grams])).strip())

它工作得非常好。

然而,我的列表有超过一百万个元组。所以我的问题是,这种方法是否足够有效,或者是否有更好的方法来做到这一点。谢谢。

共有3个答案

宦高岑
2023-03-14

你可以像这样高效地做这件事

joiner = " ".join
print map(joiner, sixgrams)

我们仍然可以使用这样的列表理解来提高性能

joiner = " ".join
print [joiner(words) for words in sixgrams]

性能对比表明,上述所见列表理解解决方案比其他两种解决方案略快。

from timeit import timeit

joiner = " ".join

def mapSolution():
    return map(joiner, sixgrams)

def comprehensionSolution1():
    return ["".join(words) for words in sixgrams]

def comprehensionSolution2():
    return [joiner(words) for words in sixgrams]

print timeit("mapSolution()", "from __main__ import joiner, mapSolution, sixgrams")
print timeit("comprehensionSolution1()", "from __main__ import sixgrams, comprehensionSolution1, joiner")
print timeit("comprehensionSolution2()", "from __main__ import sixgrams, comprehensionSolution2, joiner")

机器上的输出

1.5691678524
1.66710209846
1.47555398941

性能提升很可能是因为,我们不必每次都从空字符串创建连接函数。

编辑:虽然我们可以这样提高性能,但最有效的方法是使用lvc答案中的生成器。

林烨华
2023-03-14

列表推导创建临时字符串。只需改用 ' '.join

>>> words_list = [('this', 'is', 'a', 'foo', 'bar', 'sentences'),
...               ('is', 'a', 'foo', 'bar', 'sentences', 'and'),
...               ('a', 'foo', 'bar', 'sentences', 'and', 'i'),
...               ('foo', 'bar', 'sentences', 'and', 'i', 'want'),
...               ('bar', 'sentences', 'and', 'i', 'want', 'to'),
...               ('sentences', 'and', 'i', 'want', 'to', 'ngramize'),
...               ('and', 'i', 'want', 'to', 'ngramize', 'it')]
>>> new_list = []
>>> for words in words_list:
...     new_list.append(' '.join(words)) # <---------------
... 
>>> new_list
['this is a foo bar sentences', 
 'is a foo bar sentences and', 
 'a foo bar sentences and i', 
 'foo bar sentences and i want', 
 'bar sentences and i want to', 
 'sentences and i want to ngramize', 
 'and i want to ngramize it']

上面的< code>for循环可以表示为下面的列表理解:

new_list = [' '.join(words) for words in words_list] 
朱高丽
2023-03-14

对于大量数据,您应该考虑是否需要将其全部保留在列表中。如果您一次处理每个数据,您可以创建一个生成器,该生成器将产生每个连接的字符串,但不会将它们全部保留在占用内存的地方:

new_data = (' '.join(w) for w in sixgrams)

如果您也可以从生成器中获取原始元组,那么您也可以避免在内存中拥有六克列表。

 类似资料:
  • 问题内容: 我知道可以将一个列表连接成一个长字符串,如下所示: 显然,这将输出: 但是,我想做的就是简单地将列表中的第一个和第二个字符串连接起来,然后连接第三个和第四个字符串,依此类推。简而言之,从上面的示例中取而代之的是: 有没有简单的方法可以做到这一点?我可能还应该提到,列表中字符串的长度以及列表中字符串的数量都是不可预测的,尽管字符串的数量始终是偶数。因此原始列表也可能是: 问题答案: 您可

  • 问题内容: 我有一个包含字符串的元组列表,例如: 现在,我希望将一个元组中的每个字符串连接起来,以创建一个用空格分隔的字符串列表。我使用以下方法: 工作正常。 但是,我有超过一百万个元组的列表。所以我的问题是,这种方法是否足够有效,或者有更好的方法呢?谢谢。 问题答案: 对于大量数据,您应该考虑是否 需要 将所有数据都保留在列表中。如果您一次处理每个字符串,则可以创建一个生成器,该生成器将产生每个

  • 问题内容: 我有一个清单“ a” 我需要找到一个特定数字的所有元组。说1 我怎么做? 问题答案: 如果只希望第一个数字匹配,则可以这样操作: 如果您仅搜索其中包含1的元组:

  • 我想要一个列表,它是列表元素列表的组合,例如:我的输入 输出应该是 非常感谢您的帮助。

  • 本文向大家介绍从Python中的元组列表中找到包含给定元素的元组,包括了从Python中的元组列表中找到包含给定元素的元组的使用技巧和注意事项,需要的朋友参考一下 列表可以将元组作为其元素。在本文中,我们将学习如何识别包含特定搜索元素(字符串)的元组。 有条件 我们可以根据情况设计跟踪。之后,我们可以提及条件或条件组合。 示例 输出结果 运行上面的代码给我们以下结果- 带过滤器 我们将过滤器功能与

  • 问题内容: 我有一个小整数列表,说: 我希望收集顺序对并返回一个包含从这些对创建的元组的新列表,即: 我知道必须有一种非常简单的方法来执行此操作,但不能完全解决。 谢谢 问题答案: 好吧,有一种非常简单但有些脆弱的方法,将其自身切片后再压缩。 如果您不知道,最后一个slice参数是“ step”。因此,我们从零(1、3、5)开始选择列表中的第二个项目。然后,我们执行相同的操作,但是从一个(2,4,