2016-11-20 2 views
3

Я работаю через книгу «Automate the Boring Stuff with Python» и застрял в одной из проблем практики. Мое решение работает в оболочке, но не тогда, когда я пытаюсь запустить ее как программу. Вот проблема подсказка:Невозможно получить код в оболочке для работы в качестве программы

Допустим, вы имеете значение списка, как это:

spam = ['apples', 'bananas', 'tofu', 'cats'] 

Написать функцию, которая принимает значение списка в качестве аргумента и возвращает строку со всеми элементами, разделенных запятая и пробел, с и вставлены до последнего элемента. Например, передача предыдущего списка спама функции вернет «яблоки, бананы, тофу и кошки». Но ваша функция должна иметь возможность работать с любым переданным ей значением списка.

Вот мой код:

def listToString(usersList): 
    myStr = ', '.join(str(i) for i in usersList[0:-1]) # converts all but last list element to string and joins with commas 
    myStr = myStr + ' and ' + str(usersList[-1]) # adds on "and", converts final list element to string and adds to myStr 
    print(myStr) 

myList = input() 
listToString(myList) 

Когда я определить список в оболочке и выполнить приведенные выше шаги на этом, я получаю результат я хочу:

'apples, bananas, tofu and cats' 

Но когда Я пытаюсь сгруппировать эти шаги вместе в вышеуказанной программе, результатом которой является:

[, a, p, p, l, e, s, ,, , b, a, n, a, n, a, s, ,, , t, o, f, u, ,, , c, a, t, s and ] 

Любые идеи?

Большое спасибо, если вы нашли время, чтобы прочитать это. Есть еще несколько тем по этому же вопросу практики на SO уже (here и here), но я все еще застрял, поэтому пошел и отправил.

+0

Вам необходимо передать 'listToString' фактический список, а не строку. 'input' (в Python 3) _always_ возвращает строку. –

+1

В упражнении не сказано, что вы должны получить список из пользовательского ввода. Просто скопируйте список 'spam' в свой скрипт. –

+0

Для всех людей, говорящих OP, чтобы преобразовать строку, возвращаемую 'input' в список: пожалуйста, прочитайте вопрос! Упражнение должно написать функцию, которая принимает _list_. Вы добавляете ненужное дополнительное осложнение, которое просто не требуется для этого упражнения. –

ответ

2

input() возвращает строку. Вам нужно преобразовать строку в список, прежде чем перейти к функции с помощью str.split

myList = input().split() # 'apple banana' -> ['apple', 'banana'] 

В противном случае строка повторяется; уступая каждому персонажу в качестве предметов.

>>> a_string = 'abcd' 
>>> for x in a_string: 
...  print(x) 
... 
a 
b 
c 
d 
1

У вас возникли проблемы с input, которые вы получаете, это строка, а не list.
Сначала преобразуйте вход в список, а затем запустите свою функцию.

Попробуйте использовать .split() на входе.

1

Когда принимают входной строки, убедитесь, что вход "Раскол()", чтобы преобразовать его в строку:

def listToString(usersList): 
     myStr = ', '.join(str(i) for i in usersList[0:-1]) # converts all but last list element to string and joins with commas 
     myStr = myStr + ' and ' + str(usersList[-1]) # adds on "and", converts final list element to string and adds to myStr 
     print(myStr) 

myList = input().split(',') 
listToString(myList) 

Вход:

apples,bananas,tofu,cats 

Выход:

apples, bananas, tofu and cats 
1

Вам просто нужно присоединиться к списку согласно p РОБЛЕМА детали заявление,

def listToString(userList): 
    return ', '.join(userList[:-1]) + ' and ' + userList[-1] 

Исполнение:

In [13]: listToString(spam) 
Out[13]: 'apples, bananas, tofu and cats' 

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

In [16]: mylist = input() 
'apples,bananas,tofu,cats' 

In [19]: mylist.split(',') 
Out[19]: ['apples', 'bananas', 'tofu', 'cats'] 

In [20]: userList = mylist.split(',') 

In [21]: listToString(userList) 
Out[21]: 'apples, bananas, tofu and cats' 
Смежные вопросы