Fortran中以下Python列表理解的等价物是什么?

时间:2015-08-16 14:56:56

标签: python fortran list-comprehension fortran90

我正在尝试在Fortran中编写以下列表理解(用Python编写)。

lit = [[x,y] for x in [p,q,r] for y in [h,k,l] if [x,y]!=[a,b]]

,其中 a, b, p ,q ,r, h, k, l是整数

如果我想在2D Fortran数组中首先填充列,我该如何实现呢?

Python代码返回一个列表。它相当于

for x in [p,q,r]:
     for y in [h,k,l]:
         if [x,y]!=[a,b]:
             list.append([x,y])

我在Fortran中制作了两个子列表。 sublist_xsublist_y,其中每个列表分别包含p,q,rh,k,l

integer :: list(0:7), sublist_x(0:2),sublist_y(0:2), count
 count =-1

do i=0,7
   if (i%3 ==0)
   count = count +1
   endif
   list(0,i)=sublist_x(i%3)
   list(1,i)=sublist_y(count%3)
enddo

我认为这是一种复杂的做事方式......

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要两个小清单的笛卡儿积,不包括元素[a,b]?如果我误解了,请立即停止阅读。这是一个几乎可以做你想要的小程序......

PROGRAM test

  IMPLICIT NONE

  INTEGER, DIMENSION(:), ALLOCATABLE :: listx, listy, bad_element
  INTEGER, DIMENSION(:,:), ALLOCATABLE :: outlist
  INTEGER :: ix, jx, alstat, n_elements

  LOGICAL, DIMENSION(:), ALLOCATABLE :: rows

  listx = [1,2,3]
  listy = [21,22,23]
  bad_element = [3,21]

  n_elements = SIZE(listx)*SIZE(listy)
  ALLOCATE(outlist(2,n_elements),stat=alstat)
  IF (alstat/=0) THEN
     WRITE(*,*) "something went wrong allocating the result array"
     STOP
  ELSE
     outlist(1,:) = RESHAPE(listx,[n_elements],listx)
     outlist(2,:) = RESHAPE(SPREAD(listy,1,SIZE(listx)),[n_elements])
  END IF

  DO ix = 1, n_elements
     IF (ALL(outlist(:,ix)==bad_element)) THEN
        outlist(:,ix:) = EOSHIFT(outlist(:,ix:),1,dim=2)
     END IF
  END DO

END PROGRAM TEST

在此程序结束时,outlist包含笛卡尔积,其中任何元素等于由0替换的坏元素,并推送到outlets的末尾。对于上面的硬连线数字,输出为:

    1    2    1    2    3    1    2    3    0
   21   21   22   22   22   23   23   23    0

我想你不应该在修剪这个问题时删除0,也不要将这个程序打包成例程。我希望代码能够解释自己。