Создание списка из списка списков с использованием одного и того же повторного номера индекса для каждого списка, созданного методом enumerate - PullRequest
1 голос
/ 20 апреля 2020

Моя функция wanted_headers () удаляет кортежи из объекта «results», первый элемент которого не соответствует ни одной строке в списке заголовков. ['Fish', 'Dolphin'] из объекта result1 & ['Local Auth', 'bucket'] было удалено из файла result3.

Затем он печатает порядковый номер и список кортежей, как видно из текущего вывода ниже.

Моя цель состоит в том, чтобы «перепаковать» списки кортежей обратно вместе, используя мой текущий вывод, и сохранить в объект.

headers2 = ['Group', 'Owner', 'Person in charge', 'Type of Service',
                    'Registered Care Categories*', 'Specialist Care Categories',
                    'Languages Spoken by Staff (other than English)','Single Rooms', 
                    'Shared Rooms','Facilities & Service']


result1 = [['Group', 'MacIntyre'], ['Person in charge', ' Vivienne Donald (Manager)'],
           ['Type of Service', 'good'], ['Fish', 'Dolphin'], ['Shared Rooms', '4']]

result2 = [['Group', 'Jameseson'], ['Type of Service', 'bad'], ['Shared Rooms', '8']]

result3 = [['Group', 'MacIntyre'], ['Person in charge', ' Vivienne Donald (Manager)'],
           ['Type of Service', 'good'], ['Shared Rooms', '4'], ['Local Auth', 'bucket']]

results = [result1, result2, result3]

#Removes tuples which the first element in the tuple does not matcch any string in headers2 list
def desired_headers():
  for index, z in enumerate(list(range(len(results)))):
     for i in list(range(len(results[z]))):
       if any(x in headers2 for x in results[z][i]):  
           print(index, results[z][i])



desired_headers()

Токовый выход:

0 ['Group', 'MacIntyre']
0 ['Person in charge', ' Vivienne Donald (Manager)']
0 ['Type of Service', 'good']
0 ['Shared Rooms', '4']
1 ['Group', 'Jameseson']
1 ['Type of Service', 'bad']
1 ['Shared Rooms', '8']
2 ['Group', 'MacIntyre']
2 ['Person in charge', ' Vivienne Donald (Manager)']
2 ['Type of Service', 'good']
2 ['Shared Rooms', '4']

Желаемый выход:

[[['Group', 'MacIntyre'],
  ['Person in charge', ' Vivienne Donald (Manager)'],
  ['Type of Service', 'good'],
  ['Shared Rooms', '4']],
 [['Group', 'Jameseson'], ['Type of Service', 'bad'], ['Shared Rooms', '8']],
 [['Group', 'MacIntyre'],
  ['Person in charge', ' Vivienne Donald (Manager)'],
  ['Type of Service', 'good'],
  ['Shared Rooms', '4']]]

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Попробуйте это

lv1 = [] # initialize an empty list which we will append to based on our criteria

for lst in results: # loop though each element of the list, which itself is a list
    lv2 = []
    for el in lst: # Same as above
        if el[0] in headers2: # check if first element of the list exists in headers2
            lv2.append(el)
    lv1.append(lv2)

lv1

Или, если вы хотите функцию


def desired_headers(list_of_lists, inclution_list):
    lv1 = []

    for lst in list_of_lists:
        lv2 = []
        for el in lst:
            if el[0] in inclution_list:
                lv2.append(el)
        lv1.append(lv2)

    return lv1

desired_headers(list_of_lists=[result1, result2, result3], inclution_list=headers2)

Или, если вы знакомы с пониманием списка

result = [] 

for lst in [result1, result2, result3]:
    result.append([el for el in lst if el[0] in headers2])

result 
1 голос
/ 20 апреля 2020

Вы можете сделать это с пониманием списка:

filtered = [ [sl for sl in r if sl[0] in headers2] for r in results ]

вывод:

print(filtered)

[
    [
        ['Group', 'MacIntyre'],
        ['Person in charge', ' Vivienne Donald (Manager)'],
        ['Type of Service', 'good'],
        ['Shared Rooms', '4']
    ],
    [
        ['Group', 'Jameseson'],
        ['Type of Service', 'bad'],
        ['Shared Rooms', '8']
    ],
    [
        ['Group', 'MacIntyre'],
        ['Person in charge', ' Vivienne Donald (Manager)'],
        ['Type of Service', 'good'],
        ['Shared Rooms', '4']
    ]
]

Если у вас много данных, вы можете сделать набор из headers2 для использования в понимании списка

1 голос
/ 20 апреля 2020

Тебе нужно что-то подобное? Это сгруппирует все в один список

# Removes tuples which the first element in the tuple does not matcch any string in headers2 list
def desired_headers():
    grouped_elements = []
    for index, z in enumerate(list(range(len(results)))):
        inner_loop = []
        for i in list(range(len(results[z]))):
            if any(x in headers2 for x in results[z][i]):
                inner_loop.append(results[z][i])

        grouped_elements.append(inner_loop)

    print(grouped_elements)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...