Изменение типов данных элементов в списках списков - PullRequest
1 голос
/ 06 апреля 2020

У меня есть импортированный файл данных.

Это список, состоящий из 51 списка.

Каждый из вложенных списков состоит из 5 элементов.

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

Это то, что у меня есть:

for i in range(len(statesData)):
    statesData[i] = statesData[i].strip()
    statesData[i] = statesData[i].split(',')
    for d in statesData[i]:
        d[1] = int(d[1])
        d[2] = float(d[2])

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

Я хочу начать с 2 (1). Я думал о функции диапазона где-то вроде:

statesData[i][1:]

Но, похоже, это не работает. Любой совет? Я должен быть в состоянии сделать это без особых проблем. Или необходимость создать функцию.

Ответы [ 4 ]

0 голосов
/ 06 апреля 2020

Вы можете go со следующим довольно кратким:

for i, sd in enumerate(statesData):  
    sd = sd.strip().split(',')
    if i:  # omit first (index 0) from further processing
        sd[1:3] = int(sd[1]), float(sd[2])
    statesData[i] = sd
0 голосов
/ 06 апреля 2020

Если у вас есть список списков, содержащий только целые числа, подобные этому

t = [['0', '1', '2', '3', '4'], ['0', '5', '6', '7', '8']]

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

mod_t = [[l[0]] + [int(e) for e in l[1:]] for l in t]
# [['0', 1, 2, 3, 4], ['0', 5, 6, 7, 8]]

Пояснения:

  • Вы просматриваете все элементы списка t с помощью for l in t
  • Для каждого из этих списков вы создадите новый список с исходным первым элементом l[0] и целочисленными преобразованными элементами для всех последующих элементов [int(e) for e in l[1:]]
0 голосов
/ 06 апреля 2020

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

Также изменение списка на месте - в основном бесполезная сложность, особенно для такого небольшого набора данных. Самое простое решение - создать новый список из существующего, ie:

def parse_row(row):
    return (row[0], int(row[1]), float(row[2])) + row[3:]

def parse_data(data):
    return [parse_row(row) for row in data]

if __name__ == "__main__":
    state_data = [
    ("foo", "1", "1.5", "a", "b"),
    ("bar", "2", "2.5", "c", "d"),
    ("baaz", "3", "3.5", "e", "f"),
    ("quux", "4", "4.5", "g", "h"),
    ]
print(parse_data(state_data))

относительно вашей проблемы:

for d in statesData[i]:
    d[1] = int(d[1])
    d[2] = float(d[2])

здесь, statesData[i] ваш текущий подсписок Таким образом, переменная итерации d последовательно восстанавливается для каждого из элементов вашего подсписка.

0 голосов
/ 06 апреля 2020

Во втором l oop вы зацикливаетесь на каждом элементе вложенных списков, т.е. когда вы делаете d[1], вы индексируете строку указанного элемента. Попробуйте вместо этого

for i in range(len(statesData)):
    print(statesData[i])
    statesData[i] = statesData[i].strip()
    statesData[i] = statesData[i].split(',')
    statesData[i][1] = int(statesData[i][1])
    statesData[i][2] = float(statesData[i][2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...