リスト操作とか競技プログラミングで使ったりした私用メモ


ふと気づいたら記事が被ってた追記・更新はこちらで行なって、
[http://qiita.com/clarinet758/items/5135a8075001a3b6782b](http://qiita.com/clarinet758/items/5135a8075001a3b6782b) は廃墟に。

### 文字列を逆順に

```
a='abcdef'
a[::-1]
'fedcba'
```

##リスト、set、mapなどについて予定

###リスト

 空のリストをたくさん作る
```l=[[] for x in xrange(n)]```

縦と横を回す。
e.g.元の文字列　縦8　横8
abcdefgh
ijklmlop
qrstuvwx
yzABCDEF
GHIJKLMN
OPQRSTUV
WXYZ1234
567890!?

```python:tateyoko.py
#この場合a,bは共に8とする
(a,b)=map(int, raw_input().split())
x=[sys.stdin.readline().strip() for x in range(a)]
print x
#['abcdefgh', 'ijklmlop', 'qrstuvwx', 'yzABCDEF', 'GHIJKLMN', 'OPQRSTUV', 'WXYZ1234', '567890!?']

chikan=[[] for i in range(8)]
#元々のリストのx[0]から読み込んでいく
for a in range(8):
#仮格納のリストを初期化する
    tate=[]
#a列のb番目の要素をなめていく
    for b in range(8):
        tate.append(x[b][a])
#1文字ずつバラバラなのを結合して正式格納用のリストに入れる
    tate1=''.join(tate)
    chikan[a]=tate1
print chikan
#['aiqyGOW5', 'bjrzHPX6', 'cksAIQY7', 'dltBJRZ8', 'emuCKS19', 'flvDLT20', 'gowEMU3!', 'hpxFNV4?']
```


文字列とリスト行ったり来たり

```python:リスト操作
# 文字列の場合
orig = "hello"
li   = list(orig)   # 文字列 => リスト
text = "".join(li)  # リスト => 文字列
print li    # ['h', 'e', 'l', 'l', 'o']
print text  # hello


# 数値の配列の場合
nums = [1,2,3,4,5]
text = "".join(map(str, nums))  # リスト => 文字列
li   = list(map(int, text))     # 文字列 => リスト
print li    # [1, 2, 3, 4, 5]
print text  # 12345

#文字列からリストは内包表記を用いたほうが早くなるそうなので
#頂いたコメントの反映と使い方確認を
text='12345'
li = [int(i) for i in text]
#[1, 2, 3, 4, 5]

```

リストのソートとか

```sort.py
# 昇順にする場合はsort()を使います。
>>> m = [1, 18, 2, 117, 205]
>>> m.sort()
# x = m.sort() と書いても元リストを残して、
# xをソートしたリストにすることはできません。
>>> m
[1, 2, 18, 117, 205]


#降順の場合は、一度sort()してからreverse()を使います。
>>> n = [1, 18, 2, 117, 205]
>>> n.reverse()
>>> n
[205, 117, 2, 18, 1]
# reverse()するだけでは元のリストを逆にするだけです。
# なので昇順にソートした後に逆にします。
>>> n.sort()
>>> n.reverse()
>>> n
[205, 117, 18, 2, 1]
```

```python:リストをy=xとかで扱うときの挙動注意
>>> x=[1,6,3,8,4]
>>> y=x
>>> y
[1, 6, 3, 8, 4]
>>> x
[1, 6, 3, 8, 4]
>>> y.sort()
>>> y
[1, 3, 4, 6, 8]
>>> x
[1, 3, 4, 6, 8]
>>> y[1]=y[1]+1
>>> y
[1, 4, 4, 6, 8]
>>> x
[1, 4, 4, 6, 8]

>>> x=[1,2,3,4,5]
>>> y=x[:]
>>> x
[1, 2, 3, 4, 5]
>>> y
[1, 2, 3, 4, 5]
>>> y[1]+=3
>>> y
[1, 5, 3, 4, 5]
>>> x
[1, 2, 3, 4, 5]
```


sort()、reverse()は元のリストが残らず。。元のリストが必要な場合は

```python:ソートその２
#元のリストをx、ソート先をyとして
>>> x=[3,55,6,3,71,8,1]
>>> y=sorted(x)
>>> y
[1, 3, 3, 6, 8, 55, 71]
>>> y=reversed(x)
>>> y
<listreverseiterator object at 0x109144c10>
>>> y=x[::-1]
>>> y
[1, 8, 71, 3, 6, 55, 3]
>>> y=reversed(x)
>>> y[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'listreverseiterator' object is not subscriptable
>>> for i in y:
...   print i
... 
1
8
71
3
6
55
3
```
reversed()が謎挙動なので注意が必要っぽい。

cのリスト中にある要素になんちゃら

```python:個数を数えて最大・最小を
#cの中にある1,2,3,4の個数をcount(p)で数えて、
#空で用意したリストlへappendで追加していく。
#max(l),min(l)で最大値と最小値を
l,p=[],1
c=[1, 2, 3, 4, 1, 2, 3]
for i in xrange(4):
    l.append(int(c.count(p)))
    p+=1
print max(l),min(l)

# 要素数カウントも内包表記が良いそうなので転載を
c = [1, 2, 3, 4, 1, 2, 3]
l = [c.count(i) for i in xrange(4)]
print max(l), min(l)
```

```python:リストの中の要素に辞書でなんちゃら
i=['A','A','C','C','A','B']
h={"A":4,"B":3,"C":2,"D":1,"F":0}
for x in enumerate(i): f+=h[x[1]]
```
↑なんで通ったのかよくわからんちんなコード。これでもiのリスト内のABCに割り振られるスコアを数えられている。

リストの要素の差分？取り

```python:リストの差分
a=['a','b','c','d',1,2,'3','4']
b=['c','d','1',2,3]
#残す方のリスト-消す候補のリスト、在籍者一覧-移動者一覧=最新の在籍者 みたいな
#リストの順序は崩れる。
l=set(a)-set(b)
l
set(['a', 1, '3', 'b', '4'])
sabun=list(l)
sabun
['a', 1, '3', 'b', '4']
```

```python:リスト結合
a=[1,2,3]
b=['4','5','6']
c=a+b
#str型とint型など混ざっても問題ないっぽい
```

###リスト重複操作
重複排除とかはリスト型ではなくてset型のが処理が早い、論理式が使えるなどで便利っぽいです。set型使いましょう。

####set型
set オブジェクトは順序付けされていない hashable (ハッシュ可能な) オブジェクトのコレクションです。よくある使い方には、メンバーシップのテスト、数列から重複を削除する、そして論理積、論理和、差集合、対称差など数学的演算の計算が含まれます。
らしいです。

```python:試したor使いそうなsetの操作トカ
{raw_input()}
123
#set(['123'])

{int(raw_input())}
345
#set([345])

#空白区切りに
set(raw_input().split())
#は出来るが、

set(int, raw_input().split())
set(input().split())
#はダメ

```

```python:2つのリストから重複している要素を色々
#setを用いる場合
a=[1,2,3,1,2,3]
b=[1,4,5]

set(x)&set(y)
#set([1])
#a,bで重複している要素のみが抜き出されるっぽい
#a内、b内での重複は消え去るっぽい

set(x)|set(y)
#set([1, 2, 3, 4, 5])
#a内、b内での重複は消え去るっって全要素が一つに

set(x)^set(y)
#set([2, 3, 4, 5])
#a内、b内での重複は消え去るっぽい
#aにしかなかった、bにしかなかったが結合する

#要素数は len(set(x)&set(y)) などlenを用いて取れます。

#set型にした時点でset内の重複が消える。
#set内に重複した要素の存在は消される　ような挙動っぽいです。 set(raw_input())
23432
# set(['3', '2', '4'])
set(raw_input())
asdfgfdsa
# set(['a', 's', 'd', 'g', 'f'])
# 可能だった記法
#set(raw_input().split()) 空白区切りで中身は全てstr

#groupbyを用いる場合
#次回

```

```python:set使えない場合
#上列の文字を一文字ずつ使って下列の文字列が作成できるか？みたいな時
Instead of dogging Your footsteps it disappears but you dont notice anything
Your dog is upstears

s=list(raw_input())+[' ']*200
try: 
  map(s.remove,raw_input())
  print 'YES'
except:
  print 'NO'
```

####リストの中の要素を消す
・リストの位置、順番で指定
risuto=['a','b','c']
del　risuto[i]
risutoのi番目のが消えます

・要素で指定
risuto=['haru','natsu','aki',huyu']
risuto.remove('huyu')
これでhuyuが消えます

・末尾を消す
risuto=['haru','natsu','aki',huyu']
risuto.pop()
これで末尾のhuyuが消えます  
  



リスト内包 for文
```tt = [ x+y for x in "ABXY" for y in "ABXY" ]```

特定の文字列をカウント

```count.py
>>> x = 'aaaabbaaabaaa'
>>> x
'aaaabbaaabaaa'
>>> x.count('aa')
4
# 1,2文字目が'aa'としてカウントされたら2,3文字目の'aa'は
# カウントされないようになっている様子。

>>> x.count('a')
10
```

マッチした回数のカウント

```count.py
>>> import re

>>> x = 'aaaabbaaabaaaba'
>>> i = 0
# +の直前の文字の一文字以上の連続をカウントします。
>>> for m in re.finditer('a+', x):
...    i += 1
... 
>>> i
4

>>> re.findall('a+', x)
['aaaa', 'aaa', 'aaa', 'a']
# マッチしている箇所がリスト形式で抽出されます
# len(re.findall('a+', x)) でリストの要素数を取得で
# マッチ回数の取得と同義になるようです。

# re.findall よりも re.finditer の方がメモリ節約らしいです。
>>> i = 0
>>> for m in re.finditer('a+', x):
...    i += 1
... 
>>> i
4
```
参考先サイト様
[http://lightson.dip.jp/zope/ZWiki](http://lightson.dip.jp/zope/ZWiki/032_e7_89_b9_e5_ae_9a_e3_81_ae_e6_96_87_e5_ad_97_e3_83_bb_e6_96_87_e5_ad_97_e5_88_97_e3_81_ae_e5_87_ba_e7_8f_be_e5_9b_9e_e6_95_b0_e3_82_92_e8_aa_bf_e3_81_b9_e3_82_8b)
2013/11/14
シンタックスハイライトの件はわかってはいたはずなので完全な手抜きでした。。。編集リクエストありがとうございました。