Python 在for循环中分组数据
我需要循环一个已排序的数据集,将所有结果按该排序属性分组为具有相同属性值的块。然后我对结果块运行一些操作 抱歉,这有点让人困惑,举例可能是描述我所做工作的更好方式: 我有一个这样结构的数据集,除了“数据”字符串实际上是对象,并且包含大量其他数据Python 在for循环中分组数据,python,loops,grouping,Python,Loops,Grouping,我需要循环一个已排序的数据集,将所有结果按该排序属性分组为具有相同属性值的块。然后我对结果块运行一些操作 抱歉,这有点让人困惑,举例可能是描述我所做工作的更好方式: 我有一个这样结构的数据集,除了“数据”字符串实际上是对象,并且包含大量其他数据 [ [1, "data1"], [1, "data2"], [2, "moredata"], [2, "stuff"], [2, "things"], [2, "foo"], [3, "bar"], [4, "baz"] ] 我希望将数据分组为4
[ [1, "data1"], [1, "data2"], [2, "moredata"], [2, "stuff"],
[2, "things"], [2, "foo"], [3, "bar"], [4, "baz"] ]
我希望将数据分组为4个不同的函数调用:
process_data(1, ["data1", "data2"])
process_data(2, ["moredata", "stuff", "things", "foo"])
process_data(3, ["bar"])
process_data(4, ["baz"])
我最终得到的是一个结构,看起来像这样:
last_id = None
grouped_data = []
for row in dataset:
id = row[0]
data = row[1]
if last_id != id:
# we're starting a new group, process the last group
processs_data(last_id, grouped_data)
grouped_data = []
last_id = id
grouped_data.append(data)
if grouped_data:
# we're done the loop and we still have a last group of data to process
# if there was no data in the dataset, grouped_data will still be empty
# so we won't accidentally process any empty data.
process_data(last_id, grouped_data)
这是可行的,但似乎很笨拙。特别是需要使用最后一个_id变量以及循环后处理_数据的第二个调用来跟踪所有内容。我只是想知道是否有人能为更优雅/聪明的解决方案提供建议
我选择的语言是Python,但通用的解决方案很好。看一看。请注意,这要求您的列表已经按照组键进行了排序(示例数据就是组键,所以我想这没问题)。itertools.groupby正是您想要的:
>>> data = [ [1, "data1"], [1, "data2"], [2, "moredata"], [2, "stuff"],
... [2, "things"], [2, "foo"], [3, "bar"], [4, "baz"] ]
>>>
>>> from itertools import groupby
>>> from operator import itemgetter
>>>
>>> def process_data(key, keydata):
... print key, ':', keydata
...
>>> for key,keydata in groupby(data, key=itemgetter(0)):
... process_data(key, [d[1] for d in keydata])
...
1 : ['data1', 'data2']
2 : ['moredata', 'stuff', 'things', 'foo']
3 : ['bar']
4 : ['baz']
向groupby传递一个排序列表,以及一个关于列表中每个项目的分组依据的键函数。您将返回一个
(key,itemgenerator)
对的生成器,如图所示,该生成器将传递给我的生成过程数据方法。您可以使用多个控件,例如,来自或包
from brownie.datastructures import MultiDict
data = [ [1, "data1"], [1, "data2"], [2, "moredata"], [2, "stuff"],
[2, "things"], [2, "foo"], [3, "bar"], [4, "baz"] ]
for key, keydata in MultiDict(data).iterlists():
process_data(key, keydata)
太好了。和往常一样,Python自带所有电池,只需找到它们的位置。谢谢你给我指出了正确的方向!