为什么我的while循环在一轮之后结束?

时间:2017-01-12 21:41:52

标签: python function while-loop

def transpose(matrix):
    n=0
    while n < (len(matrix)):
        li = []
        for sets in matrix:
            li.append(sets[0])
        n += 1
        print(len(matrix))
        return li
transpose([[1,2,3],[4,5,6],[7,8,9]])

目前返回[1,4,7] 通缉结果[[1,4,7],[2,5,8],[3,6,9]]

4 个答案:

答案 0 :(得分:6)

你的while中有一个return语句,所以函数一旦到达那个点就会返回。您应该 dedent 返回与while相同的级别:

def transpose(matrix):
    n = 0
    li = []
    while n < (len(matrix)):
        ...
    return li

您还可以使用在n上迭代的for循环替换while循环和计数器range(len(matrix)),这样您就可以安全地丢弃n,然后移动li的初始化在循环之外:

def transpose(matrix):
    li = []
    for i in range(len(matrix)):
        inner_li = []
        for sets in matrix:
            inner_li.append(sets[i])
        li.append(inner_li)
    return li

我建议您采用流行的配方来转置矩阵,以使代码更清晰:

def transpose(matrix):
    return list(zip(*matrix))
>>> transpose([[1,2,3],[4,5,6],[7,8,9]])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

答案 1 :(得分:1)

缩进很重要。另外,列表li正在错误的位置进行初始化。

def transpose(matrix):
    n=0
    li = []

    while n < (len(matrix)):
        for sets in matrix:
            li.append(sets[0])
        n += 1
        print(len(matrix))
    return li

答案 2 :(得分:1)

我想你知道这一点,但为了以防万一,这可以用numpy

完成
import numpy as np
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
print A.T

答案 3 :(得分:0)

你的第一个错误是缩进class WishListsCell: UITableViewCell { var collectionView: UICollectionView! override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) layout.itemSize = CGSize(width: screenWidth, height: (screenWidth / 4)) layout.minimumInteritemSpacing = 0 layout.minimumLineSpacing = 0 layout.estimatedItemSize.height = (screenWidth / 4) layout.estimatedItemSize.width = screenWidth collectionView = UICollectionView(frame: contentView.frame, collectionViewLayout: layout) collectionView.delegate = self collectionView.dataSource = self collectionView.register(WishListsCollectionViewCell.self, forCellWithReuseIdentifier: cellId) self.contentView.addSubview(collectionView) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } extension WishListsCell: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { let items = wishListUrls[section] debugPrint("number of items in section: \(items.count)") return items.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! WishListsCollectionViewCell debugPrint("cell for item at \(indexPath)") debugPrint("indexPath.section: \(indexPath.section)") debugPrint("indexPath.row: \(indexPath.row)") if let imageUrl = wishListUrls[indexPath.section][indexPath.row] as String! { debugPrint(imageUrl) 。 第二个是在return0代替n。 第三个是在每个while循环中覆盖li的值。 这是它的工作原理:

sets[...]
不要担心。如果你好奇并尝试一下,你会变得更快,更不容易出错:)