要求的是,从下面的列表列表中,返回一个元组,该元组包含列表中给定索引的所有出现的数字2的元组。如果有X个连续的2,那么它应该只出现在包含X的内部元组中的一个元素,就像这样:
[[1, 2, 2, 1],
[2, 1, 1, 2],
[1, 1, 2, 2]]
给出
((1,), (1,), (1, 1),(2,))
虽然
[[2, 2, 2, 2],
[2, 1, 2, 2],
[2, 2, 1, 2]]
给出
((3,),(1, 1),(2,)(3,))
同样的事情怎么样但对于列而言,这次是什么呢?有一种“一线”方法吗?我的意思是:
[[1, 2, 2, 1],
[2, 1, 1, 2],
[1, 1, 2, 2]]
给出
((2,), (1, 1), (2,))
虽然
[[2, 2, 2, 2],
[2, 1, 2, 2],
[2, 2, 1, 2]]
给出
((4,),(1, 2),(2, 1))
我已经尝试了一些东西,这是其中的一件事,我无法完成它,不知道该怎么办,之后:
l = [[2,2,2],[2,2,2],[2,2,2]]
t = (((1,1),(2,),(2,)),((2,),(2,),(1,1)))
if [x.count(0) for x in l] == [0 for x in l]:
espf = []*len(l)
espf2 = []
espf_atual = 0
contador = 0
for x in l:
for c in x:
celula = x[c]
if celula == 2:
espf_atual += 1
else:
if celula == 1:
espf[contador] = [espf_atual]
contador += 1
espf_atual = 0
espf2 += [espf_atual]
espf_atual = 0
print(tuple(espf2))
输出 (3,3,3)
此输出是正确的,但如果我更改列表(l)它不起作用
答案 0 :(得分:0)
所以,你在代码中有一些错误。
索引:
for c in x:
celula = x[c]
celula = c
应该是c
x
已经指向espf_atual = 0
...
espf_atual += 1
...
espf2 += [espf_atual]
的每个元素。
中级结果
对于每个列,您将中间结果存储为:
2
但这只会允许为每列存储[2,1,2,2]
的最后一次出现。这是,如果行是espf_actual = 2
,那么1
,您将只存储最后一次出现。您将覆盖第一个匹配项(espf = []*len(l)
之前)。
为避免这种情况,您需要为每一行存储中间结果。你在espf = []
for x in l:
# Restart counters for every row
espf_current = [] # Will store any sequences of 2
contador = 0 # Will count consecutive 2's
for c in x:
celula = c
if celula == 2:
contador += 1 # Count number of 2
elif celula == 1:
if contador > 0: # Store any 2 before 1
espf_current += [contador]
contador = 0
if contador > 0: # Check if the row ends in 2
espf_current += [contador]
# Store results of this row in the final results
espf += [tuple(espf_current)]
print tuple(espf)
中途得到了它,但是你以后从未正确使用它。
查找一个工作示例(与初始解决方案没有太大区别):
i, j
切换行和列的关键是更改索引方法。目前,您正在迭代列表的元素,因此,这不允许您在行和列之间切换。
查看迭代的另一种方法是迭代矩阵的索引(numRows = len(l)
numCols = len(l[0])
for i in range(numRows):
for j in range(numCols):
celula = l[i][j]
的行和列),如下所示:
*phoenix@phoenix-Aspire-E1-570:/usr/local/hadoop$ bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.2.jar grep input output 'dfs[a-z.]+'*
以上是与前一代码等效的索引。它假设所有行具有相同的长度(在您的示例中都是如此)。将它从行更改为列很简单(提示:切换循环),我留给你:P