首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何返回列表中发生的元素数?

如何返回列表中发生的元素数?
EN

Stack Overflow用户
提问于 2019-07-22 13:57:56
回答 2查看 63关注 0票数 0

对于这个无关紧要的题目,我很抱歉,因为我找不到合适的名字来解释我的问题:

我有以下段ID:

代码语言:javascript
复制
SIDs = ['11','22','33','44']

SID的每个元素都有两个项,如下所示:

代码语言:javascript
复制
 SID[0] = ['T10','T11']
 SID[1] = ['T20','T21']
 SID[2] = ['T30','T31']
 SID[3] = ['T40','T41']

假设我有以下段I,其定义如下:

代码语言:javascript
复制
SegmentPath = ['11','22','33','11','22','33']

就元素而言,我希望构建输出项的SegmentPath如下所示:

代码语言:javascript
复制
Used_Path = ['T10', 'T20', 'T31', 'T21', 'T10', 'T20', 'T21']

编辑

如果您注意到,在SIDs中发生的每个元素只要按顺序重复一次(11, 2233)。但是当它达到33岁时,它使用了T31,回到11的方法是哪个T21。一旦我们到达11,我们就使用相同的东西到达2233

以下数字对此作了概述:

然后,我返回在Used_Path中发生的每一项的迭代,应该如下所示:

代码语言:javascript
复制
Used_Path_items = ['T10', 'T20', 'T21','T31']
iteration = [2, 2, 1, 1]

在蟒蛇身上有这样的事情吗?如果有人在python中给出一些提示或代码来提供帮助,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-22 14:11:50

答案现在更复杂了。希望这能捕捉到一些东西。我做了一些假设。(1)我们不会从44转到11 (2),在您的问题中,Used_Path包含了太多的元素。

因此,我们遵循一条线性路径,如果目的地是稍后的,则向前走,否则向后走。然后我们用和我原来的答案一样的方式来计算横线。

代码语言:javascript
复制
SIDs = ['11', '22', '33', '44']

SID = [['T10','T11'], 
       ['T20','T21'],
       ['T30','T31'],
       ['T40','T41']
]

SegmentPath = ['11','22','33','11','22','33']

Used_Path = []

for i in range(len(SegmentPath) - 1):
    depart = SIDs.index(SegmentPath[i])
    arrive = SIDs.index(SegmentPath[i+1])
    if arrive > depart:
        for j in range(depart, arrive, 1):
            Used_Path.append(SID[j][0])
    elif arrive < depart:
        for j in range(depart, arrive, -1):
            Used_Path.append(SID[j][1])
print(Used_Path)
print([Used_Path.count(t) for t in sorted(set(Used_Path))])

您可以使用以下方法从if arrive > depart中缩短。不太清楚,所以我也会留下原作。

代码语言:javascript
复制
for i in range(len(SegmentPath) - 1):
    depart = SIDs.index(SegmentPath[i])
    arrive = SIDs.index(SegmentPath[i+1])
    dir = 1 if arrive > depart else -1
    for j in range(depart, arrive, dir):
        Used_Path.append(SID[j][-1*dir]
print(Used_Path)
print([Used_Path.count(t) for t in sorted(set(Used_Path))])

如果同一段连续出现两次,则此版本将无法正常工作。

票数 2
EN

Stack Overflow用户

发布于 2019-07-22 14:08:55

我会使用collections.Counter,类似于:

代码语言:javascript
复制
from collections import Counter

Used_Path = ['T10', 'T20', 'T31', 'T21', 'T10', 'T20', 'T21'] 

c = Counter(Used_Path)

Used_Path_items = list(c.keys())
iteration = list(c.values())

但是,将它们留在Counter对象中并使用.items()可能更有用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57147649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档