Эквивалент пар Луа () для Питона - PullRequest
2 голосов
/ 27 сентября 2019

Мне нужен общий API для итерации объектов Python в виде пар ключ / индекс и значение.Так, что:

for k,v in pairs({"foo": "bar"}):
    print(k, v)

выводит "foo bar", а

for i,v in pairs(["foo", "bar"]):
    print(i, v)

выводит "0 foo" и "1 bar", как в Lua-эквиваленте (за исключением поправки на 0-indexing vs 1-indexing).

Существует ли такой API?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

Вы можете эмулировать функцию «пар», проверяя тип ввода и используя items в случае словаря и enumerate в случае списка, кортежа или по умолчанию enumerate, который будет работать на любомповторяемость:

def pairs(o):
    if isinstance(o,dict):
        return o.items()
    else:
        return enumerate(o)


for k,v in pairs({"foo": "bar"}):
    print(k, v)
for i,v in pairs(["foo", "bar"]):
    print(i, v)

печать:

foo bar
0 foo
1 bar

Также: измените на return enumerate(o,1), чтобы индексы начинались с 1.

0 голосов
/ 27 сентября 2019

Для dict используйте метод items:

for k, v in {"foo": "bar"}.items():
    print(k, v)

Для списков нет эквивалента.Однако вы можете проверить рецепт группировщика в документации itertools .

Чтобы преобразовать dict в итерацию, которая будет работать с grouper, используйте itertools.chain.from_iterable({"a": 1, "b": 2}.items()).

...