当前位置: 首页 > 面试题库 >

如何将itertools“石斑鱼”对象转换为列表

郝哲茂
2023-03-14
问题内容

我正在尝试学习如何在Python中使用itertools.groupby,我想找到每个字符组的大小。最初,我尝试查看是否可以找到单个组的长度:

from itertools import groupby
len(list(list( groupby("cccccaaaaatttttsssssss") )[0][1]))

我每次都会得到0

我做了一些研究,发现其他人正在这样做:

from itertools import groupby
for key,grouper in groupby("cccccaaaaatttttsssssss"):
    print key,len(list(grouper))

哪个很棒。我感到困惑的是,为什么后者代码有效,而前者却无效?如果我只想像原来的代码那样只让第n个小组参加,那我该怎么办?


问题答案:

第一种方法行不通的原因是,当您使用以下方法创建列表时,这些组会被“消耗”

list(groupby("cccccaaaaatttttsssssss"))

要引用的groupby文档

返回的组本身就是一个与共享底层可迭代对象的迭代器groupby()。因为源是共享的,所以当 groupby()对象前进时,上一个组将不再可见。

让我们将其分解为几个阶段。

from itertools import groupby

a = list(groupby("cccccaaaaatttttsssssss"))
print(a)
b = a[0][1]
print(b)
print('So far, so good')
print(list(b))
print('What?!')

输出

[('c', <itertools._grouper object at 0xb715104c>), ('a', <itertools._grouper object at 0xb715108c>), ('t', <itertools._grouper object at 0xb71510cc>), ('s', <itertools._grouper object at 0xb715110c>)]
<itertools._grouper object at 0xb715104c>
So far, so good
[]
What?!

我们itertools._grouper object at 0xb715104c是空的,因为它与所返回的“父”迭代器共享其内容groupby,并且这些项现在消失了,因为第一个list调用在父迭代器上进行了迭代。

实际上,如果您尝试在任何迭代器上进行两次迭代(例如,简单的生成器表达式),则实际上没有什么不同。

g = (c for c in 'python')
print(list(g))
print(list(g))

输出

['p', 'y', 't', 'h', 'o', 'n']
[]

顺便说一句,groupby如果您实际上不需要组的内容,这是获取组长度的另一种方法。这比建立一个列表来查找长度要便宜一些(并且使用更少的RAM)。

from itertools import groupby

for k, g in groupby("cccccaaaaatttttsssssss"):
    print(k, sum(1 for _ in g))

输出

c 5
a 5
t 5
s 7


 类似资料:
  • 问题内容: 我有SourceObjects列表,我需要将其转换为ResultObjects列表。 我可以使用ResultObject的方法将一个对象获取到另一个对象: 我当然可以这样: 但对于能够展示如何使用 rxJava 进行相同操作的人,我将非常感激。 问题答案: 如果发出,则可以使用以下运算符: (将您的列表转换为可观察项) (将您的商品转换为其他商品) 运算符(将完成的Observable

  • 我有以下格式的列表 如何根据其键找到值,例如我需要第3行的名称...以及如何根据行对其进行排序

  • 问题内容: 如何将java对象转换为InputStream? 问题答案: 您可以使用ObjectOutputStream 您将对象(以下代码中的obj)写入ObjectOutputStream,要转换为输入流的对象必须实现Serializable。

  • 问题内容: 如何在Java中将对象转换为int? 问题答案: 如果您确定该对象是: 或者,从Java 7开始,您可以等效地编写: 当心,它可以抛出一个,如果你的对象是不是和你要的对象是。 这样,您就假定对象是一个整数(包装的int),然后将其拆箱为一个int。 是基元,因此不能将其存储为,唯一的方法是将考虑/装箱为,然后存储为。 如果您的对象是,则可以使用方法将其转换为简单的int: 如果您的对象

  • 问题内容: 如何将String对象转换为Date对象? 我想我需要做这样的事情: 任何帮助将不胜感激。 问题答案: SimpleDateFormat dateFormat = new SimpleDateFormat(“dd.MM.yyyy”); Date date = dateFormat.parse(“1.1.2001”); 有关详细信息,请参阅: SimpleDateFormat文档

  • 问题内容: 如何将Python对象转换为对象? 我有一个提供第一个库的库,另一个提供了第二个库的库。 问题答案: 使用time.mktime()将时间元组(以当地时间为单位)转换为自大纪元以来的秒数,然后使用datetime.fromtimestamp()获得datetime对象。