По документам: https://docs.python.org/3/library/functions.html#map
карта (функция, повторяемая, ...)
Возвратите итератор, который применяет функцию к каждому элементу итерируемого, получая результаты.
Что делает карта, так это возвращает итератор, по которому вы можете итерировать, но как только вы закончите итерацию по ней, она становится пустой, или когда вы продолжаете итерацию по ней, размер итератора продолжает уменьшаться
Следовательно, когда вы закончили итерацию по итератору counts
, возвращаемому map(lambda x: [x.count('0'), x.count('1')], strs)
через sorted(counts, key=lambda x: x[0])
, он становится пустым
Чтобы избежать этого, вам нужно привести любой итератор, который вы хотите использовать повторно, в список, используя list(map(...))
, и затем вы можете использовать его столько, сколько захотите, например.
In [1]: strs = ["111", "1000", "1000", "1000"]
In [2]: counts = list(map(lambda x: [x.count('0'), x.count('1')], strs))
In [3]: counts)
Out[3]: [[0, 3], [3, 1], [3, 1], [3, 1]]
In [4]: cntSortBy0 = sorted(counts, key=lambda x: x[0])
In [5]: cntSortBy0
Out[5]: [[0, 3], [3, 1], [3, 1], [3, 1]]
In [6]: counts
Out[6]: [[0, 3], [3, 1], [3, 1], [3, 1]]
In [7]: cntSortBy1 = sorted(counts, key=lambda x: x[1])
In [9]: cntSortBy1
Out[9]: [[3, 1], [3, 1], [3, 1], [0, 3]]
In [10]: counts
Out[10]: [[0, 3], [3, 1], [3, 1], [3, 1]]
Как видите, мы использовали counts
дважды, но это никогда не было пустыми, так как теперь мы преобразовали его в список, который остается нетронутым даже после того, как вы выполняете итерацию бесчисленное количество раз.