2017-11-20 50 views
0

私はサブリストk = [ ]のリストを持っています。 は、私はサブリストk[0]k[1]を取るするフラグメントを書いて、私は比較して、私はout = [ ]の新しいリストを取得:リスト内の値がなくなるまでループします

for i in range(len(k[0])): 
     for j in range(len(k[1])): 
      r = list(chain(k[0][i],k[1][j])) 
      j = [i for i, _ in groupby(r)] 
      if len(j) < len(r): 
      out.append(j) 

私は、このようにリストkを置き換えたいと思います上記のコードを実行した後:

k = [out, k[2:]] 

その後forループが再び実行されようとしているが、サブリストはk[2:]

で切れそうになるまで新しい値 k[0]k[1]

私は 'while'と 'try'で何かを試しましたが、今は悪い結果がありました。

そして、これはテストへのコードの大きな部分は、次のとおりです。

import networkx as nx 
import matplotlib.pyplot as plt 
import pandas as pd 
from itertools import chain, combinations, groupby 

df = pd.read_csv("graph.csv", sep=';', encoding='utf-8') 

g = nx.Graph() 
g = nx.from_pandas_dataframe(df, 'nodes_1', 'nodes_2') 

plt.show() 


a1 = pd.Series([0] + df['nodes_2'][df['nodes_2']%2==0].values.tolist()) 
a2 = pd.Series(df['nodes_2'][df['nodes_2']%2==1].values.tolist()) 

b1, b2 = a1.apply(g.neighbors), a2.apply(g.neighbors) 

c1, d1 = a1.values.tolist(), b1.values.tolist() 
c2, d2 = a2.values.tolist(), b2.values.tolist() 

e00=[] 
for i in range(len(c1)): 
    for j in range(len(d1[i])): 
     if d1[i][j]%2==0: 
      d = [c1[i],d1[i][j]] 
      e00.append(d) 

e01=[] 
for i in range(len(c1)): 
    for j in range(len(d1[i])): 
     if d1[i][j]%2==1: 
      d = [c1[i],d1[i][j]] 
      e01.append(d) 

e10=[] 
for i in range(len(c2)): 
    for j in range(len(d2[i])): 
     if d2[i][j]%2==0: 
      d = [c2[i],d2[i][j]] 
      e10.append(d) 

e11=[] 
for i in range(len(c2)): 
    for j in range(len(d2[i])): 
     if d2[i][j]%2==1: 
      d = [c2[i],d2[i][j]] 
      e11.append(d) 

a00 = pd.DataFrame(e00) 
a01 = pd.DataFrame(e01) 
a10 = pd.DataFrame(e10) 
a11 = pd.DataFrame(e11) 

a = input('Write a binary number. \n') 

b=[] 
for i in range(len(a)-1): 
    c = a[i:i+2] 
    b.append(c) 

print (b, '\n') 

dct = {'00' : e00, '01' : e01, '10' : e10, '11' : e11} 

k=[] 
for i in b: 
    y = dct[i] 
    k.append(y) 

out=[]  
for i in range(len(k[0])): 
    for j in range(len(k[1])): 
     r = list(chain(k[0][i],k[1][j])) 
     j = [i for i, _ in groupby(r)] 
     if len(j) < len(r): 
      out.append(j) 

print (k, '\n') 
print (out, '\n') 

そしてgraph.csv:

nodes_1 nodes_2 
0 0  1 
1 0  2 
2 1  3 
3 1  4 
4 2  5 
5 2  6 
6 3  7 
7 3  8 
8 4  9 
9 4  10 
10 5  11 
11 5  12 
12 6  13 
13 6  14 

は、私は何をしたいですか?

サンプルバイナリ文字列:001101を入力した後、辞書に割り当てられた値:['00', '01', '11', '10', '01']を取得します。各文字でa00, a01, a10, a11は同じデータです。私のループは '00'と一致するデータを受け取り、 '01'の下のデータと比較します。リストoutが作成されます。ご覧のとおり、"11", "10", "01"の値はまだ使用されていません。したがって、outリストは比較のために次の値を取得し、前と同じように行います。消耗まで['00', '01', '11', '10', '01']。 そして、同じループがまだ使われているようにk = [out、k [2:]]を置き換えることを考えていました。

+3

通常は、反復処理中にリストを変更するのは危険です(Python以外の場合)。 Pythonの背後にあるアイデアの1つは、開発時間は処理時間以上の価値があるということです。したがって、CPUを最大限に活用する代わりに、新しいリストを作成する方が良いでしょう。余分なサイクル(およびメモリ)が必要ですが、より堅牢です。 –

+1

1.対応する出力を含む入力を含むサンプルを投稿してください。 2.なぜ「パンダ」にタグがついているのですか? 3.インポートを使用している場合、名前を変更しました(またはインポートしません)。 –

+0

'pandas'にタグを付けると、サンプルデータが追加されます。 – Dark

答えて

1

あなたのためにこの方法を試すことができます。これは正確な解決策ではありません。助けを借りて、ヒントを得ることができます。 はあなたが2-2チャックをしたいが、1つのチャックした後、あなたがそのチャックのようなこれら二つの項目の何か置き換えることをコメントアウトしたよう:ここ

first for itertation ==>> ['00', '01'] = out_list now origional list become [[out_list], '11', '10', '01'] 
for second iteration ==>> [[out_list], '11'] = out_list now origional list become [[out_list],'10', '01'] 
for third iteration ==>> [[out_list],10] = out_list now origional list become [[out_list],'01] 

for forth iteration ==>> [[out_list],'01'] = out_list now origional list become [[out_list]] 

をアプローチです:

actual_list=['00', '01', '11', '10', '01'] 

def group(updated_list,actual_list): 
    print(updated_list) #This is just for showing output 
    exit_condition = [] 
    for item in updated_list: 

     if not isinstance(item,list): 
      exit_condition.append(item) 
    if not exit_condition: 
     return 0 
    else: 
     out = [] 
     for index in range(0, len(updated_list), 2): 
      k = updated_list[index:index + 2] 
      #do you stuff with k[0] and k[1] before inserting to out list 
      out.insert(len(out), k) 


      for item in actual_list: 
       out.insert(len(updated_list), item) 

      updated_list = out 

      return group(updated_list,actual_list[1:]) 






print(group(actual_list,actual_list[2:])) 

出力:

['00', '01', '11', '10', '01'] 
[['00', '01'], '11', '10', '01'] 
[[['00', '01'], '11'], '10', '01'] 
[[[['00', '01'], '11'], '10'], '01'] 
[[[[['00', '01'], '11'], '10'], '01']] 
+0

興味深い解決策:)助けてくれてありがとう! –

+0

@TomaszPrzemskiいつも:) –

関連する問題