【问题标题】:Append to array[i] (first element) until compare condition is no longer True追加到数组[i](第一个元素),直到比较条件不再为真
【发布时间】:2022-01-15 09:16:16
【问题描述】:

我有两个像这样初始化的数组:

bins = [['1'], ['2'],...['10']]

tasks = ['1:x', '1:y', '2:x', '2:y', '2:z'.... '10:x', '10:y']

我试图遍历 [tasks] 并将 ':' 之前的字符串值与[bins] 中的每个元素进行比较,如果匹配,则将tasks[i] 附加到bins[i]。所以我期待bins 会像这样更新:

bins = [[1, 1:x, 1:y]...[10, 10:x, 10:y]]

然后我认为将 [tasks] 中 ':' 之前的内容分开以进行有效比较是有意义的,所以 我在 ':' 之前拆分了 [tasks] 的内容并创建了一个新数组:

splits = ['1', '1', '2', '2', .....'10', '10']

现在在我的代码中,如果splits[i]bins[i] 中,我实际上是在遍历[splits] 并尝试附加tasks[i],使用下面的代码:

for i in range(len(splits)):
    if (splits[i] in bins[i]) == True:
        bins[i].extend(tasks[i])

问题是上面的代码没有找到任何匹配项(从不返回True),因此bins[i] 没有更新。

我没有正确地遍历我的数组吗?我没有正确比较吗?如何将[bins] 的第一个元素与[splits] 的每个元素进行比较,直到它不匹配并移动到bins[i] 的下一个元素并重复?

【问题讨论】:

  • splits 包含字符串; bins 包含列表。所以永远不会有比赛。将其中一个的元素更改为另一个的格式(例如,splits 将是 [[1], [1], [2], [2], .....[10], [10]])会大大简化事情。
  • 你没有array,你有list
  • 使用字典进行查找

标签: python arrays


【解决方案1】:

我相信这是因为您正在比较不同的数据类型。 Bins 包含数字列表,splits 包含字符串。

看着你的问题,你似乎想要这样的东西:

for a in enumerate(bins):
    for b in enumerate(splits):
        if bins[a][0] == splits[b]
            bins[a].extend(tasks[b])
  • 调用 enumerate 和调用 range(len(bins)) 一样
  • 由于 bin 中的元素是整数,因此在列表中,您希望索引 i 上的元素和列表中的第一个(也是唯一的元素)(如果 i 为 0,则为 bins[0],即 [ 1] 然后 [1][0] 和 1 是索引 0 上的元素)

【讨论】:

  • 我刚刚编辑了我最初的问题 - 在输入 bin 时出错,bin 中的元素实际上也是字符串,所以我正在比较两个列表。我只是仔细检查了 bins[i] 和 tasks[i] 的类型,它们都是列表。所以我正在比较两个列表。现在我想知道如果比较两个列表,“if bins[i] in splits[i]”是否会起作用?
  • 我更新了我的代码示例,bins[i] 和 tasks[i] 是相同的数据类型(列表),但我们正在比较 bins[i] 和 splits[i](一个列表和一个字符串) ,这就是为什么我把 bins[i][0] 放在那里
  • 好的,实现你的例子 for i in enumerate(bins): for j in enumerate(splits): if bins[i][0] == splits[j]: bins[i].extend (tasks[j]) 我得到这个错误:“如果 bins[i][0] == splits[j]: TypeError: list indices must be integers or slices, not tuple”但是如果我使用“for i in range( len(bins)....”我得到一个“列表索引超出范围”错误,指向与元组错误相同的行。两个列表的长度/类型相同,所以我对这两个错误感到困惑
【解决方案2】:

这段代码似乎对我有用:

for i in range(len(tasks)):
  for j in range(len(bins)):
    if int(tasks[i][0]) in bins[j]:
      bins[j].append(tasks[i])
print(bins)

【讨论】:

    【解决方案3】:

    您正在将字符串与 int 进行比较

    >>> '1' in [1]
    False
    >>> '1' in [str(1)]
    True
    >>> int('1') in [1]
    True
    
    

    那么做:

    int(splits[i])
    

    它应该发送 true。

    更新。关于您的更正,尽管您的代码应该可以正常工作,但请尝试使其更pythonic,也许会做得更好。

    >>> if ('1' in ['1']) == True:
    ...     True
    ... 
    True
    >>> if ('1' in ['1']) == False:
    ...     True
    
    ... 
    >>> if '1' in ['1']:
    ...    print("do things")
    ... do things
    
    if splits[i] in bins[i]:
       bins[i].extend(tasks[i])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2021-09-24
      • 2020-11-27
      • 1970-01-01
      相关资源
      最近更新 更多