1

この単純な問題を解決するアルゴリズムが見つかりませんでした:

リスト:

  lista:  [[1,a],[1,b],[1,a],[2,s],[2,r],[3,e],[3,k],[3,t],[3,y]....]

このリストを反復処理しています。内部リストの最初の項目が次の反復と同じである反復では、x と y を交互に使用します

[1,a] --> x
[1,b] --> x
[1,a] --> x
[2,s] --> y
[2,r] --> y
[3,e] --> x
[3,k] --> x
[3,t] --> x
[3,y] --> x
4

7 に答える 7

3
lista = [[1,'a'],[1,'b'],[1,'a'],[2,'s'],[2,'r'],[3,'e'],[3,'k'],[3,'t'],[3,'y']]

>>> last_a = None
>>> toggle = 'y'
>>> for a, b in lista:
...     if last_a != a:
...         toggle = 'x' if toggle != 'x' else 'y'
...         last_a = a
...     print(a, b, toggle)
... 
(1, 'a', 'x')
(1, 'b', 'x')
(1, 'a', 'x')
(2, 's', 'y')
(2, 'r', 'y')
(3, 'e', 'x')
(3, 'k', 'x')
(3, 't', 'x')
(3, 'y', 'x')
于 2013-01-30T00:17:50.240 に答える
2

したがって、これを行うにはもっと効率的な方法があるかもしれませんが、私は itertools を使用する言い訳が好きです!

from itertools import cycle

lista = [[1, 'x'], [1, 'x'], [1, 'x'], [2, 'x'], [2, 'x'], [3, 'x'], [3, 'x'], [3, 'x'], [3, 'x']]
r = cycle(['x','y'])

last = None
for first, second in lista:
  current = first
  if current != last:
    output = r.next()
  last = current
  print output
于 2013-01-30T00:26:38.537 に答える
2

別のitertoolsアプローチ:

>>> from itertools import chain, cycle, groupby
>>> c = cycle('xy')
>>> grouped = groupby(lista, lambda x: x[0])
>>> xy = (next(c)*len(list(g)) for _, g in grouped)
>>> list(chain(*xy))
['x', 'x', 'x', 'y', 'y', 'x', 'x', 'x', 'x']
于 2013-01-30T00:44:08.570 に答える
1

これを行う楽しい方法は次のとおりです。

lista = [[1,'a'],[1,'b'],[1,'a'],[2,'s'],[2,'r'],[3,'e'],[3,'k'],[3,'t'],[3,'y']]
def function(acc,val):
    if acc[0] != val[0]:
        print acc[1]
        return (val[0],acc[2],acc[1])
    else:
        print acc[2]
        return acc
reduce(function,lista,(lista[0][0],'y','x'))

これは次を印刷します:

x
x
x
y
y
x
x
x
x
于 2013-01-30T00:41:19.377 に答える
1
import itertools as it
import operator as op

one, other = 'x', 'y'
for k, g in it.groupby(lista, op.itemgetter(0)):
    for e in g:
        print e, one
    one, other = other, one

版画

[1, 'a'] x
[1, 'b'] x
[1, 'a'] x
[2, 's'] y
[2, 'r'] y
[3, 'e'] x
[3, 'k'] x
[3, 't'] x
[3, 'y'] x
于 2013-01-30T00:46:08.387 に答える
0

これはxとyを印刷しますが、リスト内の実際のアイテムで何をしたいのかわかりませんでした。

a = [[1, "a"],[1,"b"],[1, "a"],[2, "s"],[2, "r"],[3, "e"],[3, "k"],[3, "t"],[3, "y"]]

def alternate(lst):
    current = lst[0][0]
    swap_vals = {"x": "y", "y": "x"}
    val = "x"
    print(val)
    for i in lst[1:]:
        next = i[0]
        if not current == next:
            val = swap_vals[val]
            current = next
        print(val)

alternate(a)
于 2013-01-30T00:17:16.550 に答える
0

クイック&ダーティ:

first = lista[0][0]
toprint = 'x'

print toprint

for i in range(len(lista)-1):
    new = lista[i+1][0]
    if first != new:
        toprint = 'y' if toprint != 'y' else 'x'
        first = new
    print toprint
于 2013-01-30T00:25:06.533 に答える