Python itertools.groupby()使用具有多个键的元组

时间:2018-12-18 20:51:28

标签: python group-by tuples

我正在尝试通读元组并对其进行排序。我想按列表中的第一个单词分组,并保持列表中第三个单词最小。然后,我希望它返回保留的列表的整个列表。

我找到了一个非常有用的示例here,但我希望使用包含三个单词而不是两个单词的列表来完成此操作。

我得到的当前输出是:

grape 3
apple 4
banana 1

我想要的输出是:

grape lemon 3
apple banana 4
banana pie 1

我真的只是想从列表中得到第二个单词。我怎样才能做到这一点?

import itertools
import operator

L = [('grape', 'orange', 100), ('grape', 'lemon', 3), ('apple', 'kiwi', 15), 
    ('apple', 'pie', 10), ('apple', 'banana',4), ('banana', 'pie', 1), 
    ('banana', 'kiwi', 2)]

it = itertools.groupby(L, operator.itemgetter(0))
for key, subiter in it:
    print(key, min(item[2] for item in subiter))

1 个答案:

答案 0 :(得分:3)

您的问题似乎与static void TestRegex(char[] check_chars) { string[] inputs = { "54323.5", "543g23.5" }; var check_chars2 = check_chars.Select(c => Regex.Escape(c.ToString())); string pattern = "^(" + string.Join("|", check_chars2) + ")+$"; foreach (string input in inputs) { WriteLine($"Input {input} does{(Regex.IsMatch(input, pattern) ? "" : " not")} match"); } } // Output: // Input 54323.5 does match // Input 543g23.5 does not match 无关,但与itertools.groupby有关。

要恢复第三值最小的元组,请使用min函数的key参数。

min

输出

import itertools
import operator

L = [('grape', 'orange', 100), ('grape', 'lemon', 3), ('apple', 'kiwi', 15),
    ('apple', 'pie', 10), ('apple', 'banana',4), ('banana', 'pie', 1),
    ('banana', 'kiwi', 2)]

it = itertools.groupby(L, operator.itemgetter(0))

for key, group in it:
    print(*min(group, key=operator.itemgetter(2))) # Use the key argument of min