我有一个2项元组的列表,我想将它们转换为2个列表,其中第一个包含每个元组中的第一个项目,第二个列表包含第二个项目.
例如:
original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
# and I want to become...
result = (['a', 'b', 'c', 'd'], [1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
是否有内置函数可以做到这一点?
filter
,map
并且reduce
在Python 2中完美地工作.这是一个例子:
>>> def f(x):
return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x):
return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def add(x,y):
return x+y
>>> reduce(add, range(1, 11))
55
Run Code Online (Sandbox Code Playgroud)
但是在Python 3中,我收到以下输出:
>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>
>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70> …
Run Code Online (Sandbox Code Playgroud) 已经有一段时间了,我无法绕过我想要制作的算法.基本上,我有两个列表,并希望获得两个列表的所有组合.
我可能不会解释它是正确的,所以这是一个例子.
name = 'a', 'b'
number = 1, 2
Run Code Online (Sandbox Code Playgroud)
在这种情况下的输出将是:
1. A1 B2
2. B1 A2
Run Code Online (Sandbox Code Playgroud)
棘手的部分是"name"变量中的项目可能比"number"变量中的项目更多(数字将始终等于或小于name变量).
我很困惑如何进行所有组合(嵌套for循环?),如果名称中的项目多于它们在数字列表中的项目,则更加混淆逻辑以移动名称变量中的项目.
我不是最好的程序员但是如果有人可以帮助我澄清逻辑/算法来实现这一点,我想我可以试一试.所以我刚刚陷入嵌套for循环.
更新:
这是3个变量和2个数字的输出:
name = 'a', 'b', 'c'
number = 1, 2
Run Code Online (Sandbox Code Playgroud)
输出:
1. A1 B2
2. B1 A2
3. A1 C2
4. C1 A2
5. B1 C2
6. C1 B2
Run Code Online (Sandbox Code Playgroud) 我知道如何zip()
在Python 3中使用该函数.我的问题是关于以下我觉得非常奇怪的:
我定义了两个列表:
lis1 = [0, 1, 2, 3]
lis2 = [4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
我通过zip()
以下方式使用这些:
1. test1 = zip( lis1, lis2)
2. test2 = list(zip(lis1, lis2))
Run Code Online (Sandbox Code Playgroud)
当我输入test1
翻译时,我得到了这个:
"zip object at 0x1007a06c8"
Run Code Online (Sandbox Code Playgroud)
所以,我输入list(test1)
解释器,我得到了预期的结果,但是当我list(test1)
再次输入时,我得到一个空列表.
我觉得奇怪的是,无论我test2
在解释器上输入多少次,我总能得到预期的结果,而不是空列表.
老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?
def _view(self,dbName):
db = self.dictDatabases[dbName]
data = db[3]
for row in data:
print("doing this one time")
for row in data:
print("doing this two times")
Run Code Online (Sandbox Code Playgroud)
这将打印出"一次这样做"几次(因为数据有几行),但它根本不会打印出"这样做两次"......
我第一次迭代数据工作正常,但第二次当我运行最后一个列表"for data in data"时,这没有返回...所以执行它一次工作但不是两次......?
仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......
最近Python中的某种情况让我感到震惊,经过一番研究后,其原因仍然不完全清楚.以下类定义似乎完美无缺,并将产生预期的内容:
class A: __slots__ = 'a', 'b'
class B(A): __slots__ = ()
class C(A): __slots__ = ()
class D(B, C): __slots__ = ()
Run Code Online (Sandbox Code Playgroud)
这些是以钻石继承模式排列的四个类.但是,不允许有些类似的模式.以下类定义看起来好像它们的功能与第一个相同:
class B: __slots__ = 'a', 'b'
class C: __slots__ = 'a', 'b'
class D(B, C): __slots__ = ()
Traceback (most recent call last):
File "<pyshell#74>", line 1, in <module>
class D(B, C): __slots__ = ()
TypeError: multiple bases have instance lay-out conflict
Run Code Online (Sandbox Code Playgroud)
但是,TypeError
在此示例中引发了a .因此出现了三个问题:(1)考虑到插槽名称,这是Python中的错误吗?(2)这样的答案有什么理由?(3)最好的解决方法是什么?
参考文献:
我想用两个创建一个类:collections.OrderedDict
和collections.DefaultDict
.这样我就可以获得一个有序的字典,并为访问的现有密钥设置一个默认值.有什么方法可以做到这一点?
我的解决方案是围绕我上面提到的两个类创建另一个类.由于我认为每个类中的方法具有相同的名称,这会导致错误吗?
from collections import defaultdict, OrderedDict
class owndic(OrderedDict, defaultdict):
pass
Run Code Online (Sandbox Code Playgroud)
生产
TypeError: multiple bases have instance lay-out conflict
Run Code Online (Sandbox Code Playgroud)
干杯!
python ×7
class ×2
list ×2
python-3.x ×2
algorithm ×1
combinations ×1
defaultdict ×1
filter ×1
matrix ×1
reduce ×1
slots ×1
transpose ×1