Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从列表中获取每个项目的流入/流出?_Python_Python 2.7 - Fatal编程技术网

Python 如何从列表中获取每个项目的流入/流出?

Python 如何从列表中获取每个项目的流入/流出?,python,python-2.7,Python,Python 2.7,我有以下清单: myList = [a, a, a, b, b, a, c, c, b, a] 我想计算每个独特项目的流入和流出 “a”的流入量=出现次数=5 (当转换进入“a”时) “a”的流出=在“a”之后的不同字符数=2 (从“a”到另一个字符的转换退出时) 对于流入,我有这个,它可以工作: myListDict = {} for item in myList: myListDict.setdefault(item, 0) myListDict[item] +=

我有以下清单:

myList = [a, a, a, b, b, a, c, c, b, a]
我想计算每个独特项目的流入和流出

“a”的流入量=出现次数=5 (当转换进入“a”时)

“a”的流出=在“a”之后的不同字符数=2 (从“a”到另一个字符的转换退出时)

对于流入,我有这个,它可以工作:

myListDict = {}    
for item in myList:
    myListDict.setdefault(item, 0)
    myListDict[item] += 1

但如果可能的话,我真的不知道如何在一次整体迭代中快速优雅地计算流出量。

如果您想在一次过程中计算流入量和流出量,可以使用以下结构:

from collections import Counter

last_char = None

my_list = "aaabbaccba"

inflow = Counter()
outflow = Counter()

for char in my_list:
    inflow[char] += 1
    if last_char and char != last_char:
        outflow[last_char] += 1
    last_char = char


print(inflow)
print(outflow)
它输出:

Counter({'a': 5, 'b': 3, 'c': 2})
Counter({'a': 2, 'b': 2, 'c': 1})

请注意,对于,您不需要使用
setdefault

我使用
itertools.groupby
来消除相同的连续项,然后计算流入转换。对于流出,我们只需将列表最后一项的流入计数减去1

from itertools import groupby
from collections import Counter

myList = ['a', 'a', 'a', 'b', 'b', 'a', 'c', 'c', 'b', 'a']

uniques = [key for key, g in groupby(myList)]  # ['a', 'b', 'a', 'c', 'b', 'a']
c = Counter(uniques)
inflow = dict(c)
c.update({myList[-1]: -1})  # No outflow for the last element
outflow = dict(c)

print(inflow)
# {'a': 3, 'b': 2, 'c': 1}

print(outflow)
# {'a': 2, 'b': 2, 'c': 1}

使用
collections.Counter
itertools.groupby

from collections import Counter
from itertools import groupby

def in_out_flow(lst):
    in_flow = Counter(lst)
    out_flow = Counter(k for k, _ in groupby(lst))
    out_flow[lst[-1]] -= 1
    for k,v in in_flow.items():
      print('key: {}, in flow: {}, out flow: {}'.format(k, v, out_flow[k]))
示例:

in_out_flow(['a', 'a', 'a', 'b', 'b', 'a', 'c', 'c', 'b', 'a'])
print('##')
in_out_flow(['a', 'a', 'a', 'b', 'a', 'c', 'a', 'b'])
产出:

key: a, in flow: 5, out flow: 2
key: b, in flow: 3, out flow: 2
key: c, in flow: 2, out flow: 1
##
key: a, in flow: 5, out flow: 3
key: b, in flow: 2, out flow: 1
key: c, in flow: 1, out flow: 1

myList=[a,a,a,b,a,c,a,b]
什么是
outflow[a]
?当前描述中有点模棱两可,如果“a”之后的下一个元素不同,您可以计算,因此我们有1(当a到b时)、2(当a到c时)和3(当a到b时)。所以流出量['a']=3@DeepSpace我读作
a,b
a,c
,最后的
a
不算,因为没有下面的字母你是对的。在我的示例中,在描述中,outflow['a']=2,因为最后一个'a'没有右邻接字母。在你的例子中,流出['a']是3,如前所述。这是有效的,除了最后一个元素没有流出。我现在更新我的描述。@Marko:我也更新了答案。一次通过,它同时计算流入和流出。我已经用我的真实数据进行了测试。请看一下最新的描述。哦,我现在看到了。起初没有注意到“S”是最后一个元素,流出量为0。现在一切都好了,谢谢你,埃里克@马克:不客气。使用
计数器
,您仍然可以获得一个不存在的键的计数:
流出['S']
输出
0
查看问题下的注释,看起来您不需要设置。
'abab'
'a'
的流出似乎是
2
@EricDuminil是的,我在回答后看到了评论。。。我开始编辑答案,但克里斯·兰兹和你的答案没有太多补充,我想…是的,很抱歉让人困惑。谢谢你的编辑,蒂埃里@马科:好吧,这是常有的事。我据此编辑了答案。明白了,克里斯!非常感谢您的回复!