【问题标题】:How to independently iterate each elements of python list in parralel如何并行独立迭代python列表的每个元素
【发布时间】:2022-11-01 22:49:55
【问题描述】:
circle_elem = ['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy']

我想同时循环/旋转上述列表中的每个元素 就像是:

circle_elem = ['bcdea', 'ghijf', 'lmnok', 'qrstp', 'vwxyu']
circle_elem = ['cdeab', 'hijfg', 'mnokl', 'rstpq', 'wxyuv']
#etc...........

每个元素的长度总是相同的 #BONUS:最好让循环以不同的速度移动(即确定每个元素循环的步数或等待/睡眠时间等)

我试过了:

new_cycled_list = circular_shifts(circle_elem)  
print(new_cycled_list)          ##but its rotating the entire list

        # and
for i in cycle(circle_elem):    #but its rotating the entire list
print(i)

for ii in itertools.product(circle_elem):   #this doesnt iterate all elemens separately
print(ii)

非常欢迎任何更好的方法来实现上述目标。

【问题讨论】:

  • 您是否尝试过列表理解来单独循环每个元素? new_cycled_list = [(circular_shifts(elem) for elem in circle_elem](注意,这会构建一个新列表,也可能不是您想要的)
  • 如果您的代码有效,但您正在寻求改进建议,您不妨试试codereview.stackexchange.com

标签: python


【解决方案1】:

带有字符串元素访问的列表理解将为您解决这个问题:

circle_elem = ['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy']
first_cycle = [y[1:5]+y[0] for y in circle_elem]

这将返回您要查找的内容:

['bcdea', 'ghijf', 'lmnok', 'qrstp', 'vwxyu']

【讨论】:

  • 去掉切片中的5,这样代码就不会固有地锁定到特定数量的字符。
【解决方案2】:

您需要一个单独移动每个字符串的列表理解。

>>> def circular_shifts(elems, step=1):
...     step %= min(len(e) for e in elems)
...     return [e[step:] + e[:step] for e in elems]
...
>>> circle_elem = ['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy']
>>> for i in range(5):
...     print(circular_shifts(circle_elem, i))
...
['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy']
['bcdea', 'ghijf', 'lmnok', 'qrstp', 'vwxyu']
['cdeab', 'hijfg', 'mnokl', 'rstpq', 'wxyuv']
['deabc', 'ijfgh', 'noklm', 'stpqr', 'xyuvw']
['eabcd', 'jfghi', 'oklmn', 'tpqrs', 'yuvwx']

如果你想改变原始列表:

>>> for _ in range(5):
...     circle_elem[:] = circular_shifts(circle_elem)
...     print(circle_elem)
...
['bcdea', 'ghijf', 'lmnok', 'qrstp', 'vwxyu']
['cdeab', 'hijfg', 'mnokl', 'rstpq', 'wxyuv']
['deabc', 'ijfgh', 'noklm', 'stpqr', 'xyuvw']
['eabcd', 'jfghi', 'oklmn', 'tpqrs', 'yuvwx']
['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy']

【讨论】:

  • 您对最小长度的搜索表明您支持不同的长度,但实际上并非如此。
【解决方案3】:

我认为更简单的方法是创建一个类:

>>> class Cycler():
...     def __init__(self, data):
...             self.data = data
...     def __str__(self):
...             return self.data
...     def rshift(self):
...             if self.data:
...                     self.data = self.data[-1] + self.data[:-1]
...     def lshift(self):
...             if self.data:
...                     self.data = self.data[1:] + self.data[0]

像这样你可以移动任何你想要的元素,也可以一起移动

l = ['abcde', 'fghij', 'klmno', 'pqrst', 'uvwxy']
l = [Cycler(e) for e in l]
for e in l:
   e.rshift()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 2021-12-11
    • 2019-05-02
    • 2022-11-15
    • 2020-01-05
    • 2015-12-25
    • 2014-03-12
    相关资源
    最近更新 更多