Разделить список на каждый 4-й элемент, если 5-й элемент - «Имя», или разделить на 5-й элемент, если 5-й элемент - «Адрес» - PullRequest
2 голосов
/ 19 июня 2019

У меня есть список из 8000 имен, компании, адреса1, адреса2, адреса3 (необязательно) в порядке следования, как показано ниже.Это список Python

[John
It Tech
1243 mary drive
florida-32006
mark
Infotech
1245 lonely drive
irony estate 324
Virginia-24531
Steve
king Electronics
.
.
]

Адрес3 является необязательным и не может ожидать его в последовательности каждый раз, когда имя будет начинаться с следующего из адреса2.Мне нужно разделить список на каждый n-й элемент, т. Е. Путем проверки имени, 5-й элемент - это имя или адрес.Если это адрес, увеличьте разделение на nth + 1.Если нет, продолжайте с 4. Я просто хочу добавить их в столбцы Excel.

Ниже приведен код, который я пробовал, и он разбивает список по каждому 4-му элементу.Он игнорирует, является ли 5-й элемент именем или адресом.

test2= [final1[x:x+4] for x in range(0, len(final1),4)]

Это дает мне результат как

[['John','It Tech','1243 mary drive','florida-32006'], 
['mark','Infotech','1245 lonely drive','irony estate 324'],
['Virginia-24531','Steve','king Electronics']] 
** the last list should start from Steve and the address(Virginia-24531) in the previous list***

Я прошу кого-нибудь помочь мне с этой проблемой.Большое спасибо заранее

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Ваши адреса, кажется, содержат цифры - ваши имена * не имеют. Вы можете использовать это, чтобы разделить соответственно:

from string import digits

def splitIt(data):
    i = 0
    tmp = []
    for d in data:
        # the first 4 lines we add without check - datasets have always 4 lines minimum
        if i > 3:            # this will break if you have data with fewer then 4 lines
            if not any(c in digits for c in d):  # if the 5th line has no numbers: NAME
                yield tmp
                tmp = [d]
                i = 1
        else:                                    # else another address line, check 6th
            tmp.append(d)                        # line for name (you can have as many 
            i += 1                               # lines with numbers in it after the 4th)
    yield tmp


data = ["John",       # no number
"It Tech",
"1243 mary drive",    # has number
"florida-32006",      # has number
"mark",               # no number
"Infotech",
"1245 lonely drive",
"irony estate 324",
"Virginia-24531",
"Steve",
"king Electronics",]

print(list(splitIt(data)))

Выход:

[['John', 'It Tech', '1243 mary drive', 'florida-32006'], 
 ['mark', 'Infotech', '1245 lonely drive', 'irony estate 324'], 
 ['Steve', 'king Electronics']]

Отказ от ответственности: Программисты лжи верят в имена

0 голосов
/ 19 июня 2019

Предположение ниже, что адрес имеет дефис, а имя - нет (очень опасно). Затем он обрежет первые 4 или 5 элементов списка в зависимости от того, является ли последняя запись [-1] адресом или именем.

result=[]
for x in range(len(final1)):
    tmp = final1[:5] if len(final1) >= 5 else final1
    if len(tmp)==0:
        break

    if '-' in tmp[-1]:
        result.append(tmp) 
        final1 = final1[5:]
    else:
        result.append(final1[:4])
        final1 = final1[4:]
result

[['John', 'It Tech', '1243 mary drive', 'florida-32006'],
 ['mark','Infotech','1245 lonely drive','irony estate 324','Virginia-24531'],
 ['Steve', 'king Electronics']]
...