Как я могу получить доступ к несуществующему элементу в списке? [Дубликат]

Проблема заключается в том, что значок ActionBarDrawerToggle установлен в качестве кнопки навигации на Toolbar. Эта кнопка представляет собой специальный дочерний элемент Toolbar, который будет иметь приоритет в макете. Каждому другому дочернему View s, добавленному в Toolbar, будет выделено только пространство, оставшееся после этого ImageButton. Это толкает левую сторону вашего RelativeLayout вправо, так что TextView s, в котором вы сосредоточены, не будет центрироваться относительно самого Toolbar.

К счастью, Toolbar LayoutParams имеет свойство гравитации, которое мы можем использовать для центрирования LinearLayout и его TextView s непосредственно в Toolbar, без необходимости их обертывания в другой ViewGroup.

В этом примере мы применяем эту гравитацию центра, установив LinearLayout layout_gravity на center. Не забудьте также изменить значения layout_width на wrap_content, или вы будете в той же лодке, что и раньше. Здесь ImageView имеет layout_gravity значение right|center_vertical, заменяя те layout_* атрибуты, специфичные для RelativeLayout.



    

        

        

    

    



47
задан ijverig 29 February 2012 в 01:47
поделиться

3 ответа

Нарезка не ограничена - проверяется встроенными типами. И хотя оба ваших примера, похоже, имеют одинаковый результат, они работают по-другому; попробуйте их со списком.

5
ответ дан Ignacio Vazquez-Abrams 21 August 2018 в 00:10
поделиться

Для добавления ответа, который указывает на надежный раздел в документации :

Учитывая выражение среза, подобное s[i:j:k],

Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n * k, такая, что 0 & lt; = n & lt; (J-я) / к. Другими словами, индексы i, i + k, i + 2 * k, i + 3 * k и т. Д., Останавливаясь, когда j достигнуто (но никогда не включает j). Когда k положительно, i и j сведены к len (s), если они больше

, если вы пишете s[999:9999], python возвращает s[len(s):len(s)] с len(s) < 999 и ваш шаг (1 - значение по умолчанию).

12
ответ дан mgilson 21 August 2018 в 00:10
поделиться
  • 1
    Предположительно, когда k положителен, i и j также увеличиваются до -len(s), когда они меньше? например s = 'bac'; s[-100:2] == s[-len(s):2] – Chris_Rands 4 July 2017 в 12:56
  • 2
    @Chris_Rands Когда k положителен, Python будет масштабировать i и j так, чтобы они соответствовали границам последовательности. Например, в вашем примере s[-100:2] == s[0:2] (== s[-len(s):2]). Аналогично s[-100:100] == s[0:2]. – tylerc0816 18 August 2017 в 13:26

Вы в основном ответили на свой вопрос. Нарезка за пределами последовательности (по крайней мере для встроенных) не вызывает ошибки. Это имеет смысл, когда вы об этом думаете. Индексирование возвращает один элемент, но нарезка возвращает подпоследовательность элементов. Поэтому, когда вы пытаетесь индексировать несуществующее значение, ничего не вернуть; но когда вы вырезаете последовательность за пределами границ, вы все равно можете вернуть пустую последовательность.

Также обратите внимание, что есть различие между x[3] и x[3:4]. Например:

>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]

Причина, по которой они выглядят одинаково в случае строк, заключается в том, что не существует такой вещи, как отдельный символ за пределами строки; один символ - это всего лишь 1-символьная строка.

36
ответ дан senderle 21 August 2018 в 00:10
поделиться
  • 1
    Индекс вне диапазона мог бы возвратить None вместо ошибки - это обычное соглашение Python, когда вам нечего возвращать. – Mark Ransom 29 February 2012 в 00:30
  • 2
    @MarkRansom, это правда; но при возврате None в этом случае будет сложнее рассказать между индексом вне пределов и значением None внутри списка. Но даже если для этого было обходным путем, мне остается ясным, что возвращение пустой последовательности - это правильная вещь, когда нужно давать срезанный срез. Это аналогично выполнению объединения двух непересекающихся множеств. – senderle 29 February 2012 в 00:49
  • 3
    Чтобы быть ясным, я не сказал, что вы ошибаетесь. Я вижу вашу точку в значениях None в списке. – Mark Ransom 29 February 2012 в 00:53
  • 4
    @MarkRansom, я знаю - извините, если бы я звучал оборонительно. На самом деле я просто хотел повод ссылаться на теорию множеств :). – senderle 29 February 2012 в 01:02
  • 5
    Aw, за исключением того, что я сказал "union" вместо «пересечения». – senderle 9 April 2014 в 15:34
Другие вопросы по тегам:

Похожие вопросы: