我有两个数组:array
和least_common
(过滤器数组)
以下代码遍历array
,检查匹配least_common
的元素,如果找到它,则修改它并将其附加到新数组。
for i in range (len(array)):
for j in range(len(least_common)):
if array[i] is least_common[j][0]:
new_array.append ((array[i]) + (array[i] * (mod[1]/100)))
但是,如果array
中的元素与least_common
中的任何元素都不匹配,我就不会将其附加到new_array
,然后迭代到array
中的下一个元素1}}再次开始检查过程。
答案 0 :(得分:3)
在Python中,您尝试使用列表完成的操作。还有另一种称为数组的独立数据类型,但这是出于完全不同的目的。请不要混淆并使用正确的术语列表。
列表可以迭代完成。您不需要将元素索引到列表中,然后使用索引访问它们。这是C或C ++的做事方式,而不是python。
您在原始代码中使用名为mod
的列表或词典。覆盖内置名称是个坏主意。我试着理解你在尝试什么,想出了以下代码。更进一步,但在此之前,我认为一些初学者教程也可能对你有所帮助。
new_array = []
somevalue = 0.001
for elem in array:
for anotherelem in least_common:
if elem == anotherelem[0]:
new_array.append(elem + (elem * somevalue))
答案 1 :(得分:3)
这段代码对我来说有点不对劲 - 我想你想从更像是:
开始lookup = set([x[0] for x in least_common])
new_array = []
for elem in array:
if elem in lookup:
new_array.append(elem + (elem * (mod[1]/100)))
else:
new_array.append(elem)
答案 2 :(得分:1)
使用布尔值跟踪是否找到匹配项,在每个内部循环之前设置为False
并在True
内设置为if
。每次迭代后,如果它仍然是False
,则意味着您找不到匹配项,然后应该进行追加。
您还应该遵循@Andrew所说的内容并使用for a in array:
迭代列表。如果您需要索引,请使用for i, a in enumerate(array):
。请注意,is
与==
不同。
new_array = []
for array_item in array:
found = False
for least_common_item in least_common:
if array_item is least_common_item:
found = True
if not found:
new_array.append (array_item * (1 + mod[1]/100))
如果您打算使用in
代替==
,还可以使用is
大大缩短此代码:
for array_item in array:
if array_item not in least_common:
new_array.append (array_item * (1 + mod[1]/100))
答案 3 :(得分:0)
为什么不这样:
least_common_set = frozenset(x[0] for x in least_common)
for e in array:
if e is not in least_common_set:
new_array.append(e + (e * (mod[1]/100)))
答案 4 :(得分:0)
如果我理解你的问题,这是一个可能的解决方案:
for e in array:
for lc in least_common:
if e is lc[0]:
new_array.append(e + e * (md[1] / 100))
break
else:
new_array.append(e)
{> 1}}循环中的 The else
clause在循环因列表耗尽而终止时执行,但是当循环被for
语句终止时不执行。
请注意,不需要使用break
或range
,在Python中您只需迭代序列的元素而不涉及索引 - 您可以使用len
,但在这种情况下你不需要。另外,请不要为变量使用enumerate
等内置名称:在这里,我已重命名您的词典mod
。