问题很简单,我想迭代遍历列表中的每个元素和成对的下一个元素(将最后一个元素包装在第一个元素中).
我想过两种非常规的方式:
def pairs(lst):
n = len(lst)
for i in range(n):
yield lst[i],lst[(i+1)%n]
Run Code Online (Sandbox Code Playgroud)
和:
def pairs(lst):
return zip(lst,lst[1:]+[lst[:1]])
Run Code Online (Sandbox Code Playgroud)
预期产量:
>>> for i in pairs(range(10)):
print i
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6, 7)
(7, 8)
(8, 9)
(9, 0)
>>>
Run Code Online (Sandbox Code Playgroud)
有关更多pythonic方式的任何建议吗?也许有一个我没有听说过的预定义功能?
也是一个更普遍的n折(有三胞胎,四重奏等代替对)版本可能很有趣.
我正在查看一些python 2.x代码并尝试将其翻译为py 3.x但我仍然坚持这一部分.谁能澄清什么是错的?
import random
emails = {
"x": "[REDACTED]@hotmail.com",
"x2": "[REDACTED]@hotmail.com",
"x3": "[REDACTED]@hotmail.com"
}
people = emails.keys()
#generate a number for everyone
allocations = range(len(people))
random.shuffle(allocations)
Run Code Online (Sandbox Code Playgroud)
这是给出的错误:
TypeError: 'range' object does not support item assignment
Run Code Online (Sandbox Code Playgroud) 所以这就是我想要做的:我有一个包含几个等价关系的列表:
l = [[1, 2], [2, 3], [4, 5], [6, 7], [1, 7]]
Run Code Online (Sandbox Code Playgroud)
我想结合共享一个元素的集合.这是一个示例实现:
def union(lis):
lis = [set(e) for e in lis]
res = []
while True:
for i in range(len(lis)):
a = lis[i]
if res == []:
res.append(a)
else:
pointer = 0
while pointer < len(res):
if a & res[pointer] != set([]) :
res[pointer] = res[pointer].union(a)
break
pointer +=1
if pointer == len(res):
res.append(a)
if res == lis:
break
lis,res = res,[]
return res
Run Code Online (Sandbox Code Playgroud)
它打印出来
[set([1, 2, 3, …Run Code Online (Sandbox Code Playgroud) 鉴于:
g=[[], [], [0, 2], [1, 5], [0, 2, 3, 7], [4, 6], [1, 4, 5, 6], [], [], [3, 7]]
Run Code Online (Sandbox Code Playgroud)
如何比较g中的每个列表,以便对于共享的列表,任何公共号码都可以合并到一个集合中?
例如
0存在于g[2],g[4]
因此它们合并为一组{0,2,3,7}
我尝试了以下但它不起作用:
for i in g:
for j in g:
if k in i == l in j:
m=set(i+j)
Run Code Online (Sandbox Code Playgroud)
我想做出最大可能的设定.
可能重复:
Python:基于交叉点的简单列表合并
我正在尝试对对象进行分类.每个对象都由一个名为的唯一标识符属性标识id.所以我的分类逻辑是这样的.首先,我准备一个对象列表,然后分类函数一次获取2个对象并返回frozenset包含它们的对象id.因此,如果object1和object5属于同一类别,frozenset(id1,id5)则返回a.现在我继续将这些frozensets添加到一个集合中,所以最后我有一个这样的集合
matched_set=(
frozenset(id1,id2),
frozenset(id9,id3),
frozenset(id9,id2),
frozenset(id24,id22),
frozenset(id1,id23),
frozenset(id25,id24),
frozenset(id30,id24)
)
Run Code Online (Sandbox Code Playgroud)
现在因为具有id1和id2属于同一类别的对象,具有id9和id3属于同一类别的对象,具有id9和id2属于同一类别的对象,所以具有的对象id1,id2,id3,id9应该在同一类别中.所以我应该有这样的一套set(id1,id2,id3,id9)
可以有人提供算法这样做吗?谢谢
我在python中有2D列表
list = [[9, 2, 7], [9, 7], [2, 7], [1, 0], [0, 5, 4]]
Run Code Online (Sandbox Code Playgroud)
如果出现任何交叉点,我想获得列表项的联合.例如[9, 2, 7],[9, 7],[2, 7]具有多于一个位的交叉点.这种联盟将是[9,2,7].
如何以有效的方式获得如下最终列表?
finalList = [[9,2,7], [0, 1, 5, 4]]
Run Code Online (Sandbox Code Playgroud)
NB数字顺序并不重要.
python ×6
list ×3
set ×3
algorithm ×2
intersection ×1
iteration ×1
python-3.x ×1
tuples ×1
union-find ×1