我喜欢Python列表理解语法.
它也可以用来创建字典吗?例如,通过迭代成对的键和值:
mydict = {(k,v) for (k,v) in blah blah blah} # doesn't work
Run Code Online (Sandbox Code Playgroud) python dictionary list-comprehension dictionary-comprehension
如何在Python中执行以下操作?
row = [unicode(x.strip()) for x in row if x is not None else '']
Run Code Online (Sandbox Code Playgroud)
实质上:
是否有理由更喜欢使用map()
超过列表理解,反之亦然?它们中的任何一个通常比另一个更有效或被认为是更加pythonic?
我知道列表理解会做到这一点,但我想知道是否有更短(和更多Pythonic?)的方法.
我想创建一系列不同长度的列表.每个列表将包含相同的元素e,重复n次(其中n =列表的长度).如何创建列表,而不做
__PRE__
对于每个清单?
我有一个清单l
:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
Run Code Online (Sandbox Code Playgroud)
对于45以上的数字,我想加1; 对于小于它的数字,5.
我试过了
[x+1 for x in l if x >= 45 else x+5]
Run Code Online (Sandbox Code Playgroud)
但它给了我一个语法错误.我怎样才能实现if
- else
在列表理解这样吗?
什么时候应该使用生成器表达式?什么时候应该在Python中使用列表推导?
# Generator expression
(x*2 for x in range(256))
# List comprehension
[x*2 for x in range(256)]
Run Code Online (Sandbox Code Playgroud) 是否有一种简单的方法可以使用列表推导来展平迭代列表,或者失败,你会认为什么是平衡这样的浅层列表,平衡性能和可读性的最佳方法?
我尝试使用嵌套列表理解来压缩这样的列表,如下所示:
[image for image in menuitem for menuitem in list_of_menuitems]
Run Code Online (Sandbox Code Playgroud)
但我在NameError
那里遇到麻烦,因为name 'menuitem' is not defined
.谷歌搜索并浏览Stack Overflow后,我得到了一个reduce
声明所需的结果:
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
但是这个方法相当难以理解,因为我需要那个list(x)
调用,因为x是一个Django QuerySet
对象.
结论:
感谢所有为此问题做出贡献的人.以下是我学到的内容摘要.我也将其作为社区维基,以防其他人想要添加或更正这些观察结果.
我原来的reduce语句是多余的,用这种方式编写得更好:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
这是嵌套列表理解的正确语法(Brilliant summary dF!):
>>> [image for mi in list_of_menuitems for image in mi]
Run Code Online (Sandbox Code Playgroud)
但这些方法都不如使用效率高itertools.chain
:
>>> from itertools import chain
>>> list(chain(*list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
正如@cdleary指出的那样,通过使用chain.from_iterable
如下所示来避免*操作符魔术可能是更好的风格:
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, …
Run Code Online (Sandbox Code Playgroud) 是否可以在Python中创建字典理解(用于键)?
没有列表推导,你可以使用这样的东西:
l = []
for n in range(1, 11):
l.append(n)
Run Code Online (Sandbox Code Playgroud)
我们可以将其缩短为列表理解:l = [n for n in range(1, 11)]
.
但是,假设我想将字典的键设置为相同的值.我可以:
d = {}
for n in range(1, 11):
d[n] = True # same value for each
Run Code Online (Sandbox Code Playgroud)
我试过这个:
d = {}
d[i for i in range(1, 11)] = True
Run Code Online (Sandbox Code Playgroud)
不过,我得到一个SyntaxError
上for
.
另外(我不需要这部分,但只是想知道),你能否将字典的键设置为一堆不同的值,如下所示:
d = {}
for n in range(1, 11):
d[n] = n
Run Code Online (Sandbox Code Playgroud)
字典理解是否可以实现?
d = {}
d[i for i in range(1, 11)] = [x for …
Run Code Online (Sandbox Code Playgroud) 众所周知,有列表理解,比如
[i for i in [1, 2, 3, 4]]
Run Code Online (Sandbox Code Playgroud)
并且有字典理解,比如
{i:j for i, j in {1: 'a', 2: 'b'}.items()}
Run Code Online (Sandbox Code Playgroud)
但
(i for i in (1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
将最终成为一个发电机,而不是tuple
理解.这是为什么?
我的猜测是a tuple
是不可变的,但这似乎不是答案.
python tuples list-comprehension dictionary-comprehension set-comprehension
我有一个变量长度列表,我试图找到一种方法来测试当前正在评估的列表项是否是列表中包含的最长字符串.我正在使用Python 2.6.1
例如:
mylist = ['abc','abcdef','abcd']
for each in mylist:
if condition1:
do_something()
elif ___________________: #else if each is the longest string contained in mylist:
do_something_else()
Run Code Online (Sandbox Code Playgroud)
我是蟒蛇新手,我敢肯定我只是一个大脑放屁.当然有一个简单的列表理解,我忽略了它的简短和优雅?
谢谢!
python ×10
dictionary ×2
list ×2
generator ×1
if-statement ×1
map-function ×1
replicate ×1
tuples ×1