determining which value is the first to appear five times in a list?
tjreedy at udel.edu
Sat Feb 6 23:40:53 CET 2010
On 2/6/2010 3:25 PM, Wolodja Wentland wrote:
> On Sat, Feb 06, 2010 at 14:42 -0500, Terry Reedy wrote:
>> On 2/6/2010 2:09 PM, Wolodja Wentland wrote:
>>> I think you can use the itertools.groupby(L, lambda el: el) to group
>>> elements in your *sorted* list L by the value el (i.e. the
>>> identifier) and then iterate through these groups until you find the
>>> desired number of instances grouped by the same identifier.
>> This will generally not return the same result. It depends on
>> whether OP wants *any* item appearing at least 5 times or whether
>> the order is significant and the OP literally wants the first.
> Order is preserved by itertools.groupby - Have a look:
Sorting does not.
>>>> instances = [(1, 'b'), (2, 'b'), (3, 'a'), (4, 'c'), (5, 'c'), (6, 'c'), (7, 'b'), (8, 'b')]
>>>> grouped_by_identifier = groupby(instances, lambda el: el)
>>>> grouped_by_identifier = ((identifier, list(group)) for identifier, group in grouped_by_identifier)
>>>> k_instances = (group for identifier, group in grouped_by_identifier if len(group) == 2)
>>>> for group in k_instances:
> ... print group
> [(1, 'b'), (2, 'b')]
> [(7, 'b'), (8, 'b')]
> So the first element yielded by the k_instances generator will be the
> first group of elements from the original list whose identifier appears
> exactly k times in a row.
>> Sorting the entire list may also take a *lot* longer.
> Than what?
Than linearly scanning for the first 5x item, as in my corrected version
of the original code.
Terry Jan Reedy
More information about the Python-list