Разбить большой список строк и создать список результатов - PullRequest
0 голосов
/ 15 ноября 2018

У меня большой список строк.Каждая строка имеет количество сегментов, разделенных символом «;»:

'1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;'

Я хочу разбить каждую строку на «;»и сохраните полученный список.

Я сейчас использую:

player_parts = []

for line in playerinf:
    parts = line.split(";")
    player_parts = player_parts + parts

Есть ли более быстрый способ сделать это?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Насколько я знаю, понимание списка всегда хороший подход, если важна скорость.

player_parts = [line.split(';') for line in playerinf]
0 голосов
/ 15 ноября 2018

Каждый раз, когда вы делаете player_parts = player_parts + parts, вы объединяете два списка в новый список и присваиваете этот список player_parts.Это очень неэффективно.Выполнение player_parts.extend(parts) значительно улучшит производительность, поскольку оно добавляет содержимое в конец исходного списка player_parts.


Однако, похоже, вы добавляете несколько пустых строк в player_parts список.Итак, давайте посмотрим, есть ли лучший способ.

Похоже, у вас есть файл, подобный этому:

1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;
1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72
1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;

И вы хотите этот результат:

['1,2,23,17,-1006,0.20', '1,3,3,2258,-1308,0.72', '1,2,23,17,-1006,0.20',
 '1,3,3,2258,-1308,0.72', '1,2,23,17,-1006,0.20', '1,3,3,2258,-1308,0.72']

Итакэто должно сработать:

f = open('infile', 'r')

player_parts = []

for line in f:  # For each line in the file
    for segment in line.split(';'):  # For each segment in the line
        if segment.strip():  # If the segment has anything in it besides whitespace
            player_parts.append(segment)  # Add it to the end of the list

Если вы знакомы с пониманием, вы можете сделать это:

f = open('infile', 'r')

player_parts = []

for line in f:
    player_parts.extend(segment for segment in line.split(';') if segment.strip())
0 голосов
/ 15 ноября 2018

Если я вас правильно понимаю, вы можете попробовать itertools.chain и распаковать понимание списка:

from itertools import chain

lines = ['1,2,23,17,-1006,0.20;1,3,3,2258,-1308,0.72;', '2,3,34,56,-2134,0.50;2,4,7,2125,-3408,0.56;']
parts = list(chain(*[line.split(';')[:-1] for line in lines]))

parts
# ['1,2,23,17,-1006,0.20', 
#  '1,3,3,2258,-1308,0.72', 
#  '2,3,34,56,-2134,0.50', 
#  '2,4,7,2125,-3408,0.56']

Я добавил [:-1], чтобы удалить последний пустой элементsplit(';').Однако если вам нужен этот пустой элемент, просто удалите [:-1].

Поскольку chain запускается на скомпилированном коде, он должен быть намного быстрее, чем интерпретатор python.

Время выполнения для 10000 строкявляются:

using chain: 0.34399986267089844s
using your method: > 240.234s     # (I didn't want to wait any more)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...