我正在寻找一种有效的方法,将sudo chmod 777 -R ~/Desktop/AndroidStudio
之类的数字范围与(20,24)
等其他对象结合起来,
{'a': 'b'}
如果我有一个像[(20, {'a': 'b'}), (21, {'a': 'b'}), (22, {'a': 'b'}), (23, {'a': 'b'})]
这样的数字列表,我知道迭代列表是要走的路。但在这里我有一系列数字。所以可能有一种方法可以更优雅地将元组中的范围元素包装起来。
我试图实现这一目标:
[20, 21, 22, 23]
我只是想知道是否有更好的方法来做到这一点。
答案 0 :(得分:10)
实际上,任何附加到空列表的for循环都可以转换为列表理解。
CREATE UNIQUE INDEX uidx_my_table ON my_table
(CASE WHEN organization IS NOT NULL AND ref IS NOT NULL
THEN organization || ref
END);
或者,
l = []
for x in range(20, 24):
l.append((x, data))
然而的!请注意,你得到的是这个 -
l = [(x, data) for x in range(20, 24)]
多次引用复制同一对象的位置。这是可变对象的问题,因为如果更改了一个对象,它们都会反映出这种变化。因此,我建议您在每个步骤中对数据进行复制。您可以使用内置for i in l:
print(id(i[1]))
4835204232
4835204232
4835204232
4835204232
函数,也可以使用dict.copy
模块中的函数。在前一种情况下,只完成浅拷贝,所以如果你有一个嵌套结构,那不是一个好主意。
无论如何,我就是这样做的 -
copy
如果您的词典结构不复杂(例如 - import copy
l = [(x, copy.deepcopy(data)) for x in range(20, 24)]
),我上面提到的{'a' : {'b' : 'c'}}
方法有效 -
dict.copy
答案 1 :(得分:6)
一种有趣的方式是使用zip,即
mini = 20
maxi = 24
data = {'a':'b'}
l = range(mini,maxi)
list(zip(l,[data]*len(l)))
[(20, {'a': 'b'}), (21, {'a': 'b'}), (22, {'a': 'b'}), (23, {'a': 'b'})]
答案 2 :(得分:4)
itertools.repeat
提供了一种干净的方法。
>>> from itertools import repeat
>>> min = 20
>>> max = 23
>>> data = {"a": "b"}
>>>
>>> list(zip(range(min, max+1), repeat(data)))
[(20, {'a': 'b'}), (21, {'a': 'b'}), (22, {'a': 'b'}), (23, {'a': 'b'})]
请注意,使用此方法,字典{'a':'b'}
- 或您repeat
的每个对象 - 将成为每个元组内存中的同一对象。
答案 3 :(得分:1)
只需使用列表理解:
BEGIN
SET NOCOUNT ON
declare @Time int
declare @DeleteLinger int
select @Time = convert(integer,value) from Systemproperty
where [name] = 'KeepStoreLingerTimeInMinutes'
select @DeleteLinger = convert(integer,value) from Systemproperty
where [name] = 'KeepDeleteLingerTimeInMinutes'
IF (@DeleteLinger >= @Time) SET @Time=@DeleteLinger+1
insert StorageQueue
(TimeToExecute,Operation,Parameter,RuleID,GFlags)
select DateAdd(mi,@Time,getutcdate()), 1, I.ID, r.ID, r.GFlags
from inserted I, StorageRule r
where r.Active=1 and I.Active=0 and (I.OnlineCount > 0 OR
I.OnlineScreenCount > 0)
-- try and get the value that was just inserted into StorageQueue
select @SFlags=S.GFlags FROM StorageQueue S, StorageRule r, inserted I
WHERE r.ID = S.RuleID and I.ID = S.parameter
-- if a certain value do another insert into StorageQueue
If (@SFlags = 10)
INSERT INTO StorageQueue
(TimeToExecute,Operation,Parameter,RuleID,StoreFlags)
VALUES(DateAdd(mi,@Time,getutcdate()), 1, (SELECT parameter
FROM StorageQueue),2, @SFlags)
END
或者你可以在这里使用map()
:
mins = 20
maxs = 23
data = {'a': 'b'}
print([(x, data) for x in range(mins, maxs + 1)])
# [(20, {'a': 'b'}), (21, {'a': 'b'}), (22, {'a': 'b'}), (23, {'a': 'b'})]
注意:在您的版本中,您使用print(list(map(lambda x: (x, data), range(mins, maxs + 1))))
# [(20, {'a': 'b'}), (21, {'a': 'b'}), (22, {'a': 'b'}), (23, {'a': 'b'})]
和max
作为变量名称。这不是一个好主意,因为它们已经内置了功能。请改用不同的变量名。
此外,正如其他人所提到的,您希望重复的词典将是所有元组中内存中的相同对象。你可以用@cᴏʟᴅsᴘᴇᴇᴅ的信息性答案解决这个问题。
答案 4 :(得分:0)
总是比附加到空列表更好的方法。您可以转换表单
的任何表达式result = []
for i in iterable:
result.append(something)
到列表理解
result = [something for i in iterable]
这使得代码的核心非常简单。