Заполнение 2D-списка вложенными циклами пропускает и неожиданно повторяет значения в Python

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000"          maxBufferPoolSize="20000000">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="false"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<client>
  <endpoint
            binding="wsHttpBinding"
            bindingConfiguration="wsHttpBinding_Username"
            contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType"
            name="ServicesFacadeEndpoint" />
</client>

2
задан Kyle Hobbs 19 February 2019 в 07:08
поделиться

3 ответа

Когда вы «умножаете» список, он копирует ссылки на объекты, а не на базовые объекты. Таким образом, каждая строка внешнего списка фактически ссылается на один и тот же объект внутреннего списка.

result = [[" "] * 10] * rows

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

result = [[" "] * 10 for _ in range(rows)]

Примечание: использовать xrange вместо range при использовании Python 2.

0
ответ дан augurar 19 February 2019 в 07:08
поделиться

Вот альтернативный способ сделать то, что вы пытаетесь:

def transform(li):
    l1 = []
    l2 = []

    for i, a in enumerate(li):
        if i % 2 == 0: l1.append(a)
        else: l2.append(a)

    return [l1,l2]

Преимущество этого способа состоит в том, что он будет работать для списков любой длины, вместо того, чтобы требовать жесткого кодирования # элементов.

0
ответ дан J. Taylor 19 February 2019 в 07:08
поделиться

TL; DR

Вы можете использовать нотацию понимания списка , чтобы преобразовать ваш массив в матрицу. Вот так

some_list[start:end:step]

Код

def transform(li):
    rows = len(li) // 10
    return [li[i:len(li):rows] for i in range(rows)]

Пример ввода

arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
       'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
       'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4']

Соответствующий выход

['A', 'D', 'G', 'J', 'M', 'P', 'S', 'V', 'Y', '2']
['B', 'E', 'H', 'K', 'N', 'Q', 'T', 'W', 'Z', '3']
['C', 'F', 'I', 'L', 'O', 'R', 'U', 'X', '1', '4']

Объяснение

[1122 ] «сгущенная» часть здесь - это li[i:len(li):rows], поэтому давайте объясним, что

  • Первый i внутри [] относится к началу подмассива
  • ]
  • Второй len(i) является концом подмассива
  • Третий rows является шагом . Здесь шаг равен числу строк, так как мы хотим перейти на количество строк, чтобы соответствовать ожидаемому результату в вашем вопросе

Мы извлекаем подмассив для каждая возможная строка, которая является то, что [... for i in range(rows)] для

0
ответ дан molamk 19 February 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: