有没有一种使用范围创建元组列表的有效方法?

时间:2017-12-14 10:53:30

标签: python python-3.x list tuples

我正在寻找一种有效的方法,将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]

我只是想知道是否有更好的方法来做到这一点。

5 个答案:

答案 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]

这使得代码的核心非常简单。