GVKun编程网logo

Python初始化列表列表[重复]

11

本文将为您提供关于Python初始化列表列表[重复]的详细介绍,同时,我们还将为您提供关于initializer_list、初始化列表、列表初始化、python–列表列表:如何从用户输入中列出列表?、

本文将为您提供关于Python初始化列表列表[重复]的详细介绍,同时,我们还将为您提供关于initializer_list、初始化列表、列表初始化、python – 列表列表:如何从用户输入中列出列表?、python – 只将非空列表转换为列表列表中的元组、python – 在带有元组的列表列表中查找重复项的实用信息。

本文目录一览:

Python初始化列表列表[重复]

Python初始化列表列表[重复]

我打算初始化一个长度为n的列表列表。

x = [[]] * n

但是,这以某种方式将列表链接在一起。

>>> x = [[]] * 3>>> x[1].append(0)>>> x[[0], [0], [0]]

我希望有这样的东西:

[[], [0], []]

有任何想法吗?

答案1

小编典典

问题在于它们在内存中都是完全相同的列表。当使用[x]*n语法时,得到的是n许多x对象的列表,但是它们都是对同一对象的引用。它们不是不同的实例,而是n对同一实例的引用。

要列出3个不同的列表,请执行以下操作:

x = [[] for i in range(3)]

这为你提供了3个单独的实例[],这是你想要的

[[]]*n类似于

l = []x = []for i in range(n):    x.append(l)

虽然[[] for i in range(3)]类似于:

x = []for i in range(n):    x.append([])   # appending a new list!
In [20]: x = [[]] * 4In [21]: [id(i) for i in x]Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()''s for each list,i.e same objectIn [22]: x=[[] for i in range(4)]In [23]: [id(i) for i in x]Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time

initializer_list、初始化列表、列表初始化

initializer_list、初始化列表、列表初始化

什么是列表初始化

使用一个花括号来初始化变量,表现形式如下:

std::vector<int>a{1,2,3,4,5};

或者

std::vector<int>a = {1,2,3,4,5};

这里用到了一个新的类型,即initializer_list,包含在标准库头文件中。

优点

  1. 在C++11以前,如果要初始化一个vector,需要这样做
std::vector<int>a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);

很明显,使用列表初始化使得代码量少了很多,也更加的简洁优雅。 2. 这种方式不仅仅可以用在STL中,也可以用于一般的内置类型。

int c{3};
int c = {3};

乍一看,这样做没什么优点,并没有变得更简洁,甚至还要多写两个花括号。但在CppCoreGuideline中,非常推荐这种写法。原因是有一个类型检查

int c = 3.3; //这里会进行默认类型转换
int b = {3.3}; //这里编译器会给出警告(也有可能是错误)

理论上,这样的代码更加健壮。

自定义类型使用initializer_list

c++11也提供了方法,让用户可以在自定义类型(一般指类)中使用初始化列表。

#include <iostream>
#include <vector>

class Num
{
  private:
    std::vector<int> vv;
  public:

    Num(const std::initializer_list<int> &v)
    {
        for (auto a : v)
        {
            vv.push_back(a);
        }
    }

    void PrintNum(void)
    {
        for (auto v : vv)
        {
            std::cout << v << " ";
        }
        std::cout << std::endl;
    }
};

int main(int argc, char **argv)
{
    Num n{1, 2, 3, 4};
    n.PrintNum();

    return 0;
}

实现方法,简单来说,就是加入initializer_list类型来实现构造函数,在新建对象时,就可以使用列表初始化的方式了。

一个特殊用法

在使用python的时候,有时候会这样操作

for i in [1,2,3]:
    print(i)

看起来很简洁优雅,c++其实也有这种操作

#include <iostream>

int main(int argc, char **argv)
{
    for(auto n : {1,2,3,4,5,6})
    {
        std::cout<<n<<std::endl;
    }

}

python – 列表列表:如何从用户输入中列出列表?

python – 列表列表:如何从用户输入中列出列表?

这是我做的 –

grid_len = input("Enter Grid Length: ") //Assuming grid_length to be 3
s = []
while True:
    s.append(input())
    if len(s) == int(grid_len)**2: //grid_length^2 will be 9
        print(s)
        break

当输入例如在第一个循环中为1时,在第二个循环中为2,在第三个循环中为3,依此类推至9;它创建一个这样的列表:

['1','2','3','4','5','6','7','8','9']

但我希望它是这样的:

[[1,2,3],[4,5,6],[7,8,9]]

解决方法

基于列表理解的版本.

s = [[input("Enter number: ") for _ in range(grid_len)] for _ in range(grid_len)]
print s

注意:两个正斜杠“//”不是有效的python注释标识符

python – 只将非空列表转换为列表列表中的元组

python – 只将非空列表转换为列表列表中的元组

我怎么转换这个:

[[],[],[(''ef'',1)],[(''cd'',3)],[(''ab'',2)]]

进入这个:

[[],[''ef'',1],[''cd'',3],[''ab'',2]]

我知道要将元组转换为列表,我们只需使用list(元组),或者如果它是[(1,2),(3,4)]之类的列表,我们可以使用map.我如何处理主列表中列表中的元组,而空列表保持不变?

解决方法

>>> my_list = [[],2)]]

>>> [list(*el) for el in my_list]
[[],2]]

python – 在带有元组的列表列表中查找重复项

python – 在带有元组的列表列表中查找重复项

我试图找到嵌套在列表中的元组内的重复项.整个建筑也是一个清单.如果有其他更好的方法来组织这个让我的问题得到解决 – 我很高兴知道,因为这是我在路上建立的东西.

pairsList = [
                [1,(11,12),(13,14)],#list1
                [2,(21,22),(23,24)],#list2
                [3,(31,32),#list3
                [4,(43,44),22)],#list4
               ]

每个列表中的第一个元素唯一标识每个列表.

从这个对象pairList,我想找出哪些列表具有相同的元组.所以我想报告list1与list3具有相同的元组(因为它们都有(13,14).同样,list2和list4具有相同的元组(都有(21,22))并且需要报告.列表中的元组无关紧要(list2和list4都有(13,14),即使元组中列表中的位置不同).

输出结果可以是稍后可迭代的任何内容,例如(1,3),(2,4)或[1,3],[2,4].这是我感兴趣的对.

我知道集合,并在其他情况下使用它们删除列表中的重复项,但无法理解如何解决此问题.如果一个列表包含其他列表中的任何元素,我可以像这样检查:

list1 = [1,14)]
list2 = [3,14)]
print not set(list1).isdisjoint(list2)
>>>True

因此,下面的代码让我知道哪些列表与第一个列表具有相同的元组.但是在所有列表上执行此操作的正确方法是什么?

counter = 0
for pair in pairsList:
    list0 = pairsList[0]
    iterList = pairsList[counter]
    if not set(list0).isdisjoint(iterList):
        print iterList[0] #print list ID
    counter += 1

解决方法

每个列表中的第一个元素唯一标识每个列表.

好的,然后让我们先把它转换为dict:

d = {x[0]: x[1:] for x in pairsList}

# d: 
{1: [(11,2: [(21,3: [(31,4: [(43,22)]}

让我们索引整个数据结构:

index = {}
for k,vv in d.iteritems():
    for v in vv:
        index.setdefault(v,[]).append(k)

现在索引是:

{(11,12): [1],14): [1,22): [2,4],24): [2],32): [3],44): [4]}

输出结果可以是稍后可迭代的任何内容,4].这是我感兴趣的对.

pairs = [v for v in index.itervalues() if len(v) == 2]

返回[[1,4]].

关于Python初始化列表列表[重复]的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于initializer_list、初始化列表、列表初始化、python – 列表列表:如何从用户输入中列出列表?、python – 只将非空列表转换为列表列表中的元组、python – 在带有元组的列表列表中查找重复项的相关知识,请在本站寻找。

本文标签: