我正在尝试在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_x
和sublist_y
,其中每个列表分别包含p,q,r
和h,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
我认为这是一种复杂的做事方式......
答案 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
,也不要将这个程序打包成例程。我希望代码能够解释自己。