列表中特定元素的总和,如果它们是连续的(python)

时间:2015-12-06 15:40:08

标签: python list

  

要求的是,从下面的列表列表中,返回一个元组,该元组包含列表中给定索引的所有出现的数字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)它不起作用

1 个答案:

答案 0 :(得分:0)

所以,你在代码中有一些错误。

  1. 索引:

    for c in x:
        celula = x[c]
    

    celula = c应该是c x已经指向espf_atual = 0 ... espf_atual += 1 ... espf2 += [espf_atual] 的每个元素。

  2. 中级结果

    对于每个列,您将中间结果存储为:

    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) 中途得到了它,但是你以后从未正确使用它。

  3. 查找一个工作示例(与初始解决方案没有太大区别):

    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