可能重复:
Python中的转置/解压缩功能
我有一个序列列表,每个序列有两个项目.我想把它变成两个列表.
catalog = [('abc', '123'), ('foo', '456'), ('bar', '789'), ('test', '1337')]
Run Code Online (Sandbox Code Playgroud)
现在我只是这样做:
names = []
vals = []
for product in catalog:
names.append(product[0])
vals.append(product[1])
print (names)
print (vals)
Run Code Online (Sandbox Code Playgroud)
哪个输出两个列表,并且工作得很好:
['abc', 'foo', 'bar', 'test']
['123', '456', '789', '1337']
Run Code Online (Sandbox Code Playgroud)
有更整洁,更'pythonic'的方式吗?或者我应该坚持我拥有的东西?对编程风格的任何更正或反馈都是受欢迎的,我是新手,并试图学习最佳实践.
我有一个字典有以下结构
{key1: [1,2,3,4,5], key2: [2,0,4,5,6]}
Run Code Online (Sandbox Code Playgroud)
我需要找到值列表的每个索引的最大值和最小值,因此在索引0处,我们比较1 and 2并选择2最大值和1最小值等.
我的例子的预期输出:
min = [1,0,3,4,5]
max = [2,2,4,5,6]
Run Code Online (Sandbox Code Playgroud)
我不能使用运算符,因为我不允许导入它.我尝试使用以下方法但失败(语法错误).此外,我不会迭代值集,因为不是优雅的方式(IMO).
maxVal = max(myDictionary.items(), key=(lambda k: myDictionary[k]))
Run Code Online (Sandbox Code Playgroud)
给我
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
你能纠正它还是建议任何替代方法.
我有一个格式的python数组:
[[1,2,3],[4,5,6],[7,8,9]]
Run Code Online (Sandbox Code Playgroud)
有没有办法让我把它分解成列给出:
[[1,4,7],[2,5,8],[3,6,9]]
Run Code Online (Sandbox Code Playgroud) 我列出了类似于mylist = [1,2,3,4,5,6]现在的东西我需要遍历此列表并创建3个这样的新列表
new1 = [1,4]
new2 = [2,5]
new3 = [3,6]
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么?
我有这个tuple元组:
TupleOfTuples = (('Venue1', 'Name1'), ('Venue1', 'Name2'),
('Venue2', 'Name3'), ('Venue3', 'Name4'),
('Venue3', 'Name5'), ('Venue3', 'Name6'))
Run Code Online (Sandbox Code Playgroud)
我想将其转换为得到如下结果:
Output = (('Venue1', 2), ('Venue2', 1), ('Venue3', 3))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Output包含('Venue1', 2),例如,在哪里发生2的次数.'Venue1'TupleOfTuples
我尝试len()用来计算出现次数,但是它不起作用,因为它TupleOfTuples不是单个元组而是元组的元组.
如何在Python2.7中完成?
假设我有一些带有k个元素的列表A,以及带有k个元素的列表B. 我想对列表A进行排序,但我也希望以相同的方式置换列表B.
例如
A = [2,3,1,4]
B = [5,6,7,8]
Run Code Online (Sandbox Code Playgroud)
排序后A:
A = [1,2,3,4]
B = [7,5,6,8]
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个迭代器,它会延迟创建迭代器的(可能是无限多个)副本。这可能吗?
我知道我可以通过简单地创建任何固定的有限数量的副本
from itertools import tee
iter_copies = tee(my_iter, n=10)
Run Code Online (Sandbox Code Playgroud)
但如果您事先不知道 n 或者 n 是无限的,那么这种情况就会失败。
我通常会尝试一些类似的事情
from itertools import tee
def inf_tee(my_iter):
while True:
yield tee(my_iter)[1]
Run Code Online (Sandbox Code Playgroud)
但文档指出,在迭代器上使用 tee 后,原始迭代器将无法再使用,因此这不起作用。
如果您对该应用程序感兴趣:其想法是创建一个惰性函数,可能在pytoolzunzip中使用。我当前的实现可以处理有限数量的无限迭代器(这比 plain 更好),但不能处理无限数量的无限迭代器。如果您对详细信息感兴趣,请参阅以下拉取请求。zip(*seq)
我有这样的字典
data = {
'a': [95, 93, 90],
'b': [643, 611, 610]
}
Run Code Online (Sandbox Code Playgroud)
我想迭代dict并从每个项的值列表中获取键和值,类似这样
{'a': 95, 'b': 643}
{'a': 93, 'b': 611}
{'a': 90, 'b': 610}
Run Code Online (Sandbox Code Playgroud)
我已经为此实现了逻辑并且它工作正常,但是当我看到正在temp_dict创建的过程中,我看到许多中间不必要的循环.最终的结果很好,但我认为它可以改进很多.
import timeit
data = {
'a': [95, 93, 90],
'b': [643, 611, 610]
}
def calculate(**kwargs):
temp_dict = {}
index = 0
len_values = list(kwargs.values())[0]
while index < len(len_values):
for k, v in kwargs.items():
temp_dict[k] = v[index]
index += 1
yield temp_dict
start_time = timeit.default_timer()
for k in (calculate(**data)):
print(k)
print(timeit.default_timer() …Run Code Online (Sandbox Code Playgroud) d是一个字符串列表,其中每个项目由两部分组成(用点连接).我想在每个字符串项的点之前和之后提取部分.
我就是这样做的.
d = ['a1.b1', 'a2.b2', 'a3.b3']
b = [c.split('.')[0] for c in d]
a = [c.split('.')[1] for c in d]
Run Code Online (Sandbox Code Playgroud)
但我猜有更多的pythonic方式?
在python2.7中,下面的代码获取字典fd(在此示例中表示单词及其计数的频率分布),并将其分为两个列表的列表:[[keys],[values]]:
sortedDKandVs = [zip(*sorted(fd.items(), key=itemgetter(1), reverse=True))] #[word,word,...],[count,count]
Run Code Online (Sandbox Code Playgroud)
我可以做,例如:
keys = sortedDKandVs[0]
values = sortedDKandVs[1]
Run Code Online (Sandbox Code Playgroud)
这不再适用于Python3,我想知道如何转换代码.
这里没有答案如何将元组列表解压缩到单个列表中?因为在Python3中,zip对象返回迭代器而不是列表,但是我不知道如何转换答案.
python ×9
list ×2
python-2.7 ×2
python-3.x ×2
count ×1
dictionary ×1
iterator ×1
numpy ×1
tuples ×1