根据另一个列表中的位置替换列表中的所有值

时间:2018-08-28 13:27:44

标签: python list

假设我们有一个列表和一个列表列表。我想替换后者的每个子列表中的所有值,以使值i被前者的第i位的值替换。例如:

l = [4,2,1,0,3]
l_of_l = [[0,3],[4,1,2,3],[2,4]]

desired_output = [[4,0],[3,2,1,0],[1,3]]

所有0l[0]代替,4等于1。所有l[1]都由2代替,l等于0。依此类推。

所有数字仅在6中出现一次,最大和最小之间的所有数字都在那里。即,如果最小值为list(range(7)),最大值为l_of_l,则列表将是l的改组版本。同样,l包含的列表中存在的所有数字都出现在6中(即,如果6中的最大值为l_of_l,则不会有任何数字大于for this_l in l_of_l: for i in range(len(this_l)): this_l[i] = l[this_l[i]] 的任何列表中的{{1}}。

我已经做到了:

{{1}}

但是我不太喜欢循环。有没有更Python的方法来做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以使用列表理解:

sink

输出:

l = [4,2,1,0,3]
l_of_l = [[0,3],[4,1,2,3],[2,4]]
result = [[l[b] for b in i] for i in l_of_l]

或者,如果您希望完全避免显式循环,则可以使用[[4, 0], [3, 2, 1, 0], [1, 3]]

map

输出:

result = list(map(lambda x:list(map(lambda c:l[c], x)), l_of_l))

尽管后者不如列表理解那么干净。

答案 1 :(得分:1)

列表理解始终是一个选择,尽管它不会像您的解决方案那样就位:

result = [[l[x] for x in row] for row in l_of_l]

我知道您说过您不想要一种完全递归的解决方案,但这是一个适用于包含整数和其他可迭代对象的任意嵌套可迭代对象的解决方案:

from functools import partial

def lookup(table, values):
    try:
        return list(map(partial(lookup, table), values))
    except TypeError:
        return table[values]

IDEOne链接:https://ideone.com/atwfnO

答案 2 :(得分:1)

通过将class HomeViewController:UIViewController { @IBOutlet weak var collectionView: UICollectionView! var firestore:Firestore = Firestore.firestore() override func viewDidLoad() { super.viewDidLoad() let query = firestore.collection("/offers") let dataSource = collectionView.bind(toFirestoreQuery: query) { (collectionView, indexPath, documentSnapshot) -> UICollectionViewCell in let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! OfferHolderCollection print("POPULATING") cell.myLabel?.text = documentSnapshot.data()?["name"] as? String return cell } } for一起使用,可以避免显式的内部map循环:

list.__getitem__