Как преобразовать список строк в список целых чисел в Python 3x

#python-3.x #string #list-comprehension

#python-3.x #строка #список-понимание

Вопрос:

Я пытаюсь преобразовать список чисел в строковом формате в целые числа.

Я пробовал понимание списка: marks = [int(x) for x in marks] и я также пробовал сопоставление: new_list = list(map(int, marks)) но оба они приводят к TypeError :

 TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
  

Полный код:

 size = int(input())
students_and_marks = []
students = []
marks = []

for x in range((size * 2)):
    students_and_marks.append(input())

for x in range(1):
    students.append(students_and_marks[0::2])
    marks.append(students_and_marks[1::2])

new_list = list(map(int, marks))
  

Комментарии:

1. Что такое marks ?

2. Звучит не так, как вы ожидаете.

3. marks это список чисел в строке. Я использовал type(marks[x]) для подтверждения его типа данных.

4. Интерпретатор Python сообщает вам, что это не так. Оба кода верны, хотя первый является более «питоническим» способом. Кроме того, я бы создал новую переменную для marks вместо переназначения.

5. Я опубликовал полный код

Ответ №1:

Оба ваших примера кода верны. Если вы хотите применить функцию к списку, вы можете либо использовать представление списка, либо передать map в конструктор list, хотя предпочтительнее представление списка.

Проблема во входных данных. В частности,

 marks.append(students_and_marks[1::2])
  

Рассмотрим,

 >>> a = [1,2,3,4,5]
>>> a[1::2]
[2, 4]
  

Из вашего вопроса неясно, что вы намеревались делать со своим фрагментом, т.е. students_and_marks[1::2] . Вы добавляете его к, marks даже если students_and_marks[1::2] это уже список.

То, что вы сделали, было,

 >>> marks = ['1', '2']
>>> nested_marks = []
>>> nested_marks.append(marks)
>>> nested_marks
[['10', '9']]
>>> int(nested_marks)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
  

Хотя я полагаю, что вы намеревались сделать,

 >>> students_and_marks = ['Linus', '10', 'David', '9']
>>> students = students_and_marks[::2]
>>> students
['Linus', 'David']
>>> marks = students_and_marks[1::2]
>>> marks
['10', '9']
>>> new_marks = [int(mark) for mark in marks]
>>> new_marks
[10, 9]
  

Комментарии:

1. У меня был большой, смешанный список имен и чисел. Это было в таком формате: [name, its number, name, its number] . Я хотел создать 2 списка. 1 для имени и 1 для числа, и я хотел сохранить числа в их индексах, чтобы они соответствовали присвоенным им именам. Но числа все еще были строковыми, поэтому я хотел преобразовать их в числа /.

2. Почему вы используете ''.join() ?

3. Вы читали мое объяснение и видели мой пример? Если проблема в том, что вы получаете TypeError , показывают ли мои примеры кода, почему?

4. Не совсем. Я прочитал это, но это не имеет смысла. Извините.

5. Я обновил свой ответ примером, связанным с вашим кодом. Это похоже на домашнее задание, поэтому я не собираюсь прямо рассказывать вам. Я думаю, вам стоит увидеть эту ошибку.

Ответ №2:

Замените оба append() метода во 2-м цикле на extend() и готово.

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

Наконец, ваш код будет выглядеть следующим образом:

 size = int(input())
students_and_marks = []
students = []
marks = []

for x in range((size * 2)):
    students_and_marks.append(input())

print(students_and_marks)
for x in range(1):
    students.extend(students_and_marks[0::2])
    marks.extend(students_and_marks[1::2])

print(marks)                     # ['R A', '2', 'K T', '4', 'P K', '6']
new_list = list(map(int, marks)) # ['2', '4', '6']
print(new_list)                  # [2, 4, 6]
  

Терминальный ввод и вывод

 Rishikeshs-MacBook-Air:PythonCode hygull$ python3 stk_prob_str.py 
3
R A
2
K T
4
P K
6
['R A', '2', 'K T', '4', 'P K', '6']
['2', '4', '6']
[2, 4, 6]