Python 中的絮凝数据
Flocculating data in Python
我正在努力寻找我的絮凝功能的错误。
该函数的目标是获取一个列表并将每组连续值分块为单个值。例如...
[1, 4, 4, 2, 0, 3, 3, 3] => [1, 4, 2, 0, 3]
现在的功能是...
def flocculate(array):
for index1, val1 in enumerate(array):
if val1 == 0 or not not val1:
new_array = array[index1+1:]
for index2, val2 in enumerate(new_array):
if array[index1] == val2:
array[index1 + index2 + 1] = False
else:
break
return [value for value in array if type(value) is not bool]
但是,它似乎不能很好地处理零。
例如,下面显示的输入正确了一些零,但遗漏了其他一些...
[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0] => [2, 4, 3, 7, 0, 2, 8, 0]
我删除了原来的答案;我终于在这个语境下理解了"flocculate"。不好意思。。。我被陶瓷多年蒙蔽了双眼。
您将做太多工作,标记匹配或不匹配的内容。简单地从原始列表构建一个新列表。只添加 不 匹配前一个的项目。
test_list = [
[1, 4, 4, 2, 0, 3, 3, 3],
[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0],
[-122, 4, 14, 0, 3, 7, 0, 2, 2, -2, 8, 0, 0, 0, 9999]
]
def flocculate(array):
# return list(set(array))
result = []
last = None
for i in array:
if i != last:
result.append(i)
last = i
return result
for array in test_list:
print array, "\n =>", flocculate(array)
输出:
[1, 4, 4, 2, 0, 3, 3, 3]
=> [1, 4, 2, 0, 3]
[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0]
=> [2, 4, 0, 3, 7, 0, 2, 8, 0]
[-122, 4, 14, 0, 3, 7, 0, 2, 2, -2, 8, 0, 0, 0, 9999]
=> [-122, 4, 14, 0, 3, 7, 0, 2, -2, 8, 0, 9999]
将您的第一个 if 语句更改为 if val1 is not False:
可以解决问题。也就是说,我强烈建议您改用 。将列表中的每个元素与前一个元素进行比较的方法要简单得多。 (而且它还具有不改变输入列表的优点。)
您的代码中的错误是由于 False == 0
在 Python 中被计算为 True
造成的。这会导致您的函数出现两个问题。第一个是 if 块中的代码将为列表中的每个元素 运行,即使您已经将该元素标记为 False
。这导致了第二个问题:False
元素之后的任何 0 值都将被视为应该丢弃的连续相等值(因为 False == 0
)。因此,只要你有一个 0 跟随连续的相等元素,这个 0 就会变成 False,因此不会出现在输出列表中。
作为一个简短的例子,下面是输入 [2, 4, 4, 0]
函数每次迭代开始时列表的样子(其中“>”表示当前索引)。
Input: [2, 4, 4, 0]
[>2, 4, 4, 0]
[2, >4, 4, 0]
[2, 4, >False, 0]
[2, 4, False, >False]
Output: [2, 4]
我想您可能正在寻找 itertools.groupby。
此函数收集相似项(由可选键函数定义的相似性)。
例如:
import itertools
def flocculate(A):
return [k for k,g in itertools.groupby(A)]
print flocculate([2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0])
print flocculate([1, 4, 4, 2, 0, 3, 3, 3])
打印:
[2, 4, 0, 3, 7, 0, 2, 8, 0]
[1, 4, 2, 0, 3]
我正在努力寻找我的絮凝功能的错误。
该函数的目标是获取一个列表并将每组连续值分块为单个值。例如...
[1, 4, 4, 2, 0, 3, 3, 3] => [1, 4, 2, 0, 3]
现在的功能是...
def flocculate(array):
for index1, val1 in enumerate(array):
if val1 == 0 or not not val1:
new_array = array[index1+1:]
for index2, val2 in enumerate(new_array):
if array[index1] == val2:
array[index1 + index2 + 1] = False
else:
break
return [value for value in array if type(value) is not bool]
但是,它似乎不能很好地处理零。
例如,下面显示的输入正确了一些零,但遗漏了其他一些...
[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0] => [2, 4, 3, 7, 0, 2, 8, 0]
我删除了原来的答案;我终于在这个语境下理解了"flocculate"。不好意思。。。我被陶瓷多年蒙蔽了双眼。
您将做太多工作,标记匹配或不匹配的内容。简单地从原始列表构建一个新列表。只添加 不 匹配前一个的项目。
test_list = [
[1, 4, 4, 2, 0, 3, 3, 3],
[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0],
[-122, 4, 14, 0, 3, 7, 0, 2, 2, -2, 8, 0, 0, 0, 9999]
]
def flocculate(array):
# return list(set(array))
result = []
last = None
for i in array:
if i != last:
result.append(i)
last = i
return result
for array in test_list:
print array, "\n =>", flocculate(array)
输出:
[1, 4, 4, 2, 0, 3, 3, 3]
=> [1, 4, 2, 0, 3]
[2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0]
=> [2, 4, 0, 3, 7, 0, 2, 8, 0]
[-122, 4, 14, 0, 3, 7, 0, 2, 2, -2, 8, 0, 0, 0, 9999]
=> [-122, 4, 14, 0, 3, 7, 0, 2, -2, 8, 0, 9999]
将您的第一个 if 语句更改为 if val1 is not False:
可以解决问题。也就是说,我强烈建议您改用
您的代码中的错误是由于 False == 0
在 Python 中被计算为 True
造成的。这会导致您的函数出现两个问题。第一个是 if 块中的代码将为列表中的每个元素 运行,即使您已经将该元素标记为 False
。这导致了第二个问题:False
元素之后的任何 0 值都将被视为应该丢弃的连续相等值(因为 False == 0
)。因此,只要你有一个 0 跟随连续的相等元素,这个 0 就会变成 False,因此不会出现在输出列表中。
作为一个简短的例子,下面是输入 [2, 4, 4, 0]
函数每次迭代开始时列表的样子(其中“>”表示当前索引)。
Input: [2, 4, 4, 0]
[>2, 4, 4, 0]
[2, >4, 4, 0]
[2, 4, >False, 0]
[2, 4, False, >False]
Output: [2, 4]
我想您可能正在寻找 itertools.groupby。
此函数收集相似项(由可选键函数定义的相似性)。
例如:
import itertools
def flocculate(A):
return [k for k,g in itertools.groupby(A)]
print flocculate([2, 4, 4, 0, 3, 7, 0, 2, 2, 2, 8, 0, 0, 0])
print flocculate([1, 4, 4, 2, 0, 3, 3, 3])
打印:
[2, 4, 0, 3, 7, 0, 2, 8, 0]
[1, 4, 2, 0, 3]