Как разделить сегменты на nestled-списки - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь разделить 100 списков из вложенного списка.Я просмотрел несколько примеров по переполнению стека, но все еще не могу заставить что-то работать правильно.

Мой основной список называется data_to_insert и содержит другие списки.Я хотел бы извлечь (порцию) 100 списков из основного вложенного списка.

Как мне это сделать?

Это мой текущий код, который не работает по мере необходимости.

def divide_chunks(l, n):
   for i in range(0, len(l), n):
      yield l[i:i + n]

n = 100
x = list(divide_chunks(data_to_insert, 100)) 

Пример вложенного списка:

data_to_insert = [['item1','item2','item3','item4','item5','item6'],
 ['item1','item2','item3','item4','item5','item6'],
 ['item1','item2','item3','item4','item5','item6'],
 ['item1','item2','item3','item4','item5','item6'],
 ['item1','item2','item3','item4','item5','item6'],
 ...
 [thousands of others lists go here]]

Желаемый вывод - это другой список (sliced_data), который содержит 100 списков из вложенного списка (data_to_insert).

sliced_data = [['item1','item2','item3','item4','item5','item6'],
 ['item1','item2','item3','item4','item5','item6'], 
 ...
 [98 more lists go here]]

Мне нужно циклически перемещаться по вложенному списку data_to_insert, пока он не станет пустым.

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018

Я разработал второй метод для достижения своей цели, который основан на Суфиан Гори предложение использовать random.

if len(my_nestled_list) > 0:

  # Obtains the length of the data to insert.
  # The length is the number of sublists
  # contained in the main nestled list.
  data_length = len(my_nestled_list))

  # A loop counter used in the
  # data insert process.
  i = 0

  # The number of sublists to slice
  # from the main nestled list in
  # each loop.
  n = 100

  # This loop execute a set of statements
  # as long as the condition below is true
  while i < data_length:

    # Increments the loop counter
    if len(my_nestled_list)) < 100:
      i += len(my_nestled_list))
    else:
      i += 100

    # Uses list comprehension to randomly select 100 lists 
    # from the nestled list.  
    random_sample_of_100 = [my_nestled_list)[i] for i in sorted(random.sample(range(len(my_nestled_list))), n))]

   print (random_sample_of_100)
0 голосов
/ 07 декабря 2018

Если я правильно понял ваш вопрос, вам нужно сначала сгладить список, а затем создать его.Вот пример использования chain.from_iterable из itertools module вместе с кодом, который вы использовали для создания чанков:

from itertools import chain

def chunks(elm, length):
    for k in range(0, len(elm), length):
        yield elm[k: k + length]


my_list = [['item{}'.format(j) for j in range(7)]] * 1000
flattened = list(chain.from_iterable(my_list))

chunks = list(chunks(flattened, 100))

print(len(chunks[10]))

Вывод:

100
0 голосов
/ 10 декабря 2018

После некоторых трудоемких исследований я разработал работающее решение.Решение ниже перебирает список списков и извлекает 100 списков.

# Verifies that the list data_to_insert isn't empty
if len(data_to_insert) > 0:

  # Obtains the length of the data to insert.
  # The length is the number of sublists
  # contained in the main nestled list.
  data_length = len(data_to_insert)

  # A loop counter used in the
  # data insert process.
  i = 0

  # The number of sublists to slice
  # from the main nestled list in
  # each loop.
  n = 100

  # This loop execute a set of statements
  # as long as the condition below is true
  while i < data_length:

    # Increments the loop counter
    if len(data_to_insert) < 100:
      i += len(data_to_insert)
    else:
       i += 100

    # Slices 100 sublists from the main nestled list.
    sliced_data = data_to_insert[:n]

    # Verifies that the list sliced_data isn't empty
    if len(sliced_data) > 0:

      # Removes 1000 sublists from the main nestled list.
      data_to_insert = data_to_insert[n:]

      ##################################
      do something with the sliced_data
      ##################################

      # Clears the list used to store the
      # sliced_data in the insertion loop.
      sliced_data.clear()
      gc.collect()

   # Clears the list used to store the
   # data elements inserted into the
   # database.
   data_to_insert.clear()
   gc.collect()
0 голосов
/ 07 декабря 2018

Вы можете использовать random для выбора 100 случайных вложенных списков из вашего заданного списка.

Это выведет 3 случайный вложенный список из исходного списка,

import random

l = [[1,2], [3,4], [1,1], [2,3], [3,5], [0,0]]
print(random.sample(l, 3))


# output,
[[3, 4], [1, 2], [2, 3]]

Если вам не нужен вывод списка, замените print(random.sample(l, 3)) на print(*random.sample(l, 3)),

# output,
[1, 2] [2, 3] [1, 1]

Если вы просто хотите сначала 100 вложенных списков, тогда сделайте,

print(l[:100])
...