Индексы индекса списка Python отрицательные, но нет IndexError [duplicate]

Да, Шагун прав.

В принципе, когда вы отправляете искровое задание, которое искроет, оно не сериализует файл, который вы хотите обработать каждому работнику. Вам нужно будет сделать это самостоятельно.

Как правило, вам придется помещать файл в общую файловую систему, такую ​​как HDFS, S3 (amazon) или любую другую DFS, к которой могут обращаться все рабочие. Как только вы это сделаете, и укажите место назначения файла в своем искровом сценарии, искровое задание сможет читать и обрабатывать по вашему желанию.

Однако, сказав это, копирование файла в тот же назначение во ВСЕХ ваших работников и файловая структура мастера также работают. Exp, вы можете создавать папки, такие как /opt/spark-job/all-files/ во всех искровых узлах, rsync файл для всех них, а затем вы можете использовать файл в своем искровом скрипте. Но, пожалуйста, не делайте этого. DFS или S3 лучше, чем этот подход.

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

3 ответа

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

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

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

Учитывая выражение среза, подобное 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 19 August 2018 в 00:44
поделиться
  • 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 19 August 2018 в 00:44
поделиться
  • 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
Другие вопросы по тегам:

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