Вы можете просто использовать пользовательский TimePicker с отражением для установки значений.
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
try {
Class<?> classForid = Class.forName("com.android.internal.R$id");
Field field = classForid.getField("minute");
NumberPicker mMinuteSpinner = (NumberPicker) findViewById(field.getInt(null));
mMinuteSpinner.setMinValue(5);
mMinuteSpinner.setMaxValue((60 / timeInterval) - 1);
List<String> displayedValues = new ArrayList<>();
for (int i = 0; i < 60; i += timeInterval)
displayedValues.add(String.format("%02d", i));
mMinuteSpinner.setDisplayedValues(displayedValues.toArray(new String[0]));
mMinuteSpinner.setWrapSelectorWheel(true);
} catch (Exception e) {
e.printStackTrace();
}
}
Таким образом, вы можете установить, какие значения вы хотите
zip
его собственная инверсия! Если Вы используете специальное предложение * оператор.
>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)])
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
способ, которым это работает, путем вызова zip
с аргументами:
zip(('a', 1), ('b', 2), ('c', 3), ('d', 4))
†¦ кроме аргументов передаются zip
непосредственно (после того, чтобы быть преобразованным в кортеж), таким образом, нет никакой потребности волноваться о количестве аргументов, становящихся слишком большой.
Вы могли также сделать
result = ([ a for a,b in original ], [ b for a,b in original ])
, Это должно масштаб лучше. Особенно, если Python выполняет не расширение пониманий списка, если не необходимый.
(Кстати, это делает с 2 кортежами (пара) списков, а не список кортежей, как zip
делает.)
, Если бы генераторы вместо фактических списков в порядке, это сделало бы это:
result = (( a for a,b in original ), ( b for a,b in original ))
генераторы не жуют через список, пока Вы не просите каждый элемент, но с другой стороны, они действительно сохраняют ссылки на исходный список.