【问题标题】:how to generate many lists and assign values to them如何生成许多列表并为它们分配值
【发布时间】:2017-03-08 15:34:10
【问题描述】:

我想从列表中读取特定数量的行并将所有这些值分配给新列表。然后我想从之前的 last_value+1 行中读取下一行的完全相同的行数,并将它们分配给一个新列表。到目前为止,我有这个:

假设u = [1,2,3....,9,10,11,12,13...,19,20],我想将u 中的前10 个值分配给我新生成的list1 = [] => list1 = [1,2,..9,10]

然后我希望将来自 u 的下 10 个值分配给 list2 所以 list2 = [11,12,13..,20]。到目前为止的代码是:

nLines = 10
nrepeats = 2
j=0
i=0

while (j<nrepeats):
### Generating empty lists ###
mklist = "list" + str(j) + " = []"
### do the segmentation ###
for i, uline in enumerate(u):
    if i >= i and i < i+nLines:
       mklist.append(uline)
j=j+1

现在的问题是,我不能追加到 mklist,因为它是一个字符串:

AttributeError: 'str' object has no attribute 'append'

如何在该循环中分配这些值?

【问题讨论】:

  • 你真的希望一切都变成字符串吗?您不想以列表列表结尾吗?
  • if i &gt;= i and i &lt; i+nLines: 这些is 应该是js 吗?照原样,此条件始终为真。
  • @PatrickHaugh 我打算这样做:if i &gt;= 0 and i &lt; 10 阅读这些行并附加它们。但是,我还没有弄清楚当它应该读取值 11 到 20 时,条件在循环的下一步中的外观。
  • @Denziloe 不,我不想要字符串。每 10 行就有一个新列表。喜欢list1=[1-10], list2=[11-20]
  • 使用列表理解mklist = [uline for i, uline in enumerate(u) if i &gt;= i and i &lt; i+nLines]

标签: python loops while-loop assign


【解决方案1】:

您可以使用更合适的集合,例如字典:

nLines = 10
nrepeats = 2
j=0
i=0

my_dict = {}

while (j<nrepeats):
    ### Generating empty lists ###
    my_dict[str(j)] = []
    ### do the segmentation ###
    for i, uline in enumerate(u):
        if i >= i and i < i+nLines:
            my_dict[str(j)].append(uline)
j=j+1

【讨论】:

  • 这是个好主意。我如何访问它们?只有 my_dict[0] 用于前 10 个值?
  • @Shaun 是的,没错,但您需要将访问器转换为字符串:例如my_dict[str(0)] 将返回第一个数组。
  • 很好的答案,谢谢!你的方法和 Patrick Haugh 的一样有效:)
【解决方案2】:

您可以使用zip 函数将可迭代对象中的元素分组到相同大小的组中。实际上有两种方法,它们在处理无法干净划分源数据的情况的方式上有所不同

u = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

第一种方法是使用常规的zip 并丢弃剩余的片段

>>>list(zip(*[iter(u)]*10))
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20)]

第二种方式使用itertools.zip_longest并用一些fillvalue填充最后一组(默认None

>>>import itertools
>>>list(itertools.zip_longest(*[iter(u)]*10, fillvalue=None))
[(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), (11, 12, 13, 14, 15, 16, 17, 18, 19, 20), (21, None, None, None, None, None, None, None, None, None)]

【讨论】:

  • 太棒了!例如,我如何再次访问前十个值?假设我有上面定义的 u 和 x 相似但不同的数字。现在我想绘制 u 的前 10 个数字与 x 的前 10 个数字
  • 您可以像访问任何其他列表一样访问它们。前 10 个值将位于结果列表的零索引处。
  • 如何访问第一个列表中的第一个条目?所以如果是 ((1,2,3),(4,5,6),....) 我如何从第一个列表中打印 1?
  • 我们将列表称为l。例如l = [[1,2,3],[4,5,6]]l[0][1,2,3][1,2,3][0]1。 Python 将它们链接在一起没有问题,所以l[0][0]1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2011-04-24
  • 2021-10-18
相关资源
最近更新 更多