2016-10-01 2 views
1

Я использую Python 3 и пытаюсь определить, является ли элемент последним в списке, но иногда повторяется. Это мой код:Detect If Item является последним в списке

a = ['hello', 9, 3.14, 9] 
for item in a: 
    print(item, end='') 
    if item != a[-1]: 
     print(', ') 

И я хотел бы этот выход:

hello, 
9, 
3.14, 
9 

Но я получаю этот выход:

hello, 
93.14, 
9 

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

+3

Не используя цикл: 'print (* a, sep = ', \ n')' –

+0

@MartijnPieters Вау, спасибо. Почему он не добавляет запятую для последнего элемента? – nedla2004

+0

@ nedla2004: потому что 'sep' является * разделителем *, который проходит между элементами. 'end' - это терминатор, который идет после последнего элемента. – torek

ответ

9

Вместо того, чтобы пытаться определить, находится ли у вас последний элемент, напечатайте запятую и новую строку при печати следующего (который требует только обнаружения, если вы находитесь на первый):

a = ['hello', 9, 3.14, 9] 
for i, item in enumerate(a): 
    if i: # print a separator if this isn't the first element 
     print(',') 
    print(item, end='') 
print() # last newline 

enumerate() функция добавляет счетчик для каждого элемента (см What does enumerate mean?) и if i: верно для всех значений счетчика, за исключением 0 (первый элемент).

или использовать print() вставить разделители:

print(*a, sep=',\n') 

Значение sep вставляется между каждым аргументом (*a применяет все значения в a в виде отдельных аргументов см What does ** (double star) and * (star) do for parameters?). Это более эффективно, чем использование print(',n'.join(map(str, a))), так как это не обязательно для создания целого нового строкового объекта.

+0

Это именно то, что я хочу, я просто не могу его принять. – nedla2004

+0

Кроме того, не могли бы вы объяснить оба метода. (Я совершенно смущен.) – nedla2004

+0

@ nedla2004: какие детали запутывают? Что ['enumerate()' does] (https://stackoverflow.com/questions/22171558/what-does-enumerate-mean)? Или почему 'if i:' истинно все, кроме первого элемента? –

5

Если вы действительно просто хотите присоединиться к вашим элементам в запятую + символ новой строки, разделенные строки, то это проще использовать str.join метод:

elements = ['hello', 9, 3.14, 9] 
s = ',\n'.join(str(el) for el in elements) 
# And you can do whatever you want with `s` string: 
print(s) 
+0

@MartijnPieters, конечно, но 'print' печатает вашу строку, и есть вероятность, что вы захотите впоследствии обработать эту строку. – skovorodkin

+0

Вы также можете использовать карту! 'print (', \ n'.join (map (str, elements)))' –

0

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

a = ['hello', 9, 3.14, 9] 
def is_last(alist,choice): 
     if choice == alist[-1]: 
      print("Item is last in list!") 
      return True 
     else: 
      print("Item is not last") 
      return False 

if is_last(a,9) == True: 
    <do things> 

else: 
    <do other things> 
+0

Yep, Python использует отрицательные индексы для подсчета справа налево в списке. – AgataB

+0

'is_last (a, 9)' будет возвращать 'True' ** дважды **, для' a [1] 'и' a [3] '. Кроме того, не используйте '== True' в' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

3

Вы не получаешь ожидаемый результат, потому что в вашем коде вы говорите, «Эй, питон, печать запятая, если текущий элемент не равен последний элемент.»

Второй элемент 9 равен последнему элементу, поэтому запятая не печатается.

Правильный путь для проверки последнего элемента проверить индекс элемента: (. Кроме того, это может бросить ошибку значение Вы должны проверить, что тоже.)

a = ['hello', 9, 3.14, 9] 
for item in a: 
    print(item, end='') 
    if a.index(item) != len(a)-1: #<--------- Checking for last element here 
     print(', ') 

Смежные вопросы